Mit den Attributen minLength und maxLength können bei tt:value sowie bei tt:write und tt:read Längenangaben length gemacht werden, um bei der Serialisierung bzw. Deserialisierung die Länge der zu übertragenden Daten einzuschränken.
Für length können positive ganze Zahlen angegeben werden. Längenangaben können für Datenknoten bzw. Variablen der ABAP-Typen c, x, string und xstring gemacht werden. Bei anderen Datentypen hat eine Längenangabe keine Wirkung.
Die Angabe des Attributs length wirkt bei tt:value und tt:write immer so, als seien minLength und maxLength gleichzeitig mit dem in length angegebenen Wert aufgeführt.
Das Attribut minLength bzw. length legt fest, dass der resultierende XML-Wert mindestens die in length angegebene Anzahl an Zeichen bzw. Bytes darstellt. Falls ein übergebener Wert weniger Zeichen bzw. Bytes enthält wird er rechts mit Leerzeichen bzw. 0x00 auf die angegebene Länge verlängert und daraus ein XML-Wert erzeugt. Mit dem Attribut maxLength bzw. length wird die maximale Anzahl an Zeichen bzw. Bytes festgelegt, die übergeben werden dürfen. Wenn der zu serialisierende XML-Wert mehr Zeichen oder Bytes enthält als durch length angegeben, kommt es zur Ausnahme CX_ST_CONSTRAINT_ERROR, außer es sind nur schließende Leerzeichen oder Null-Bytes bei der Serialisierung eines Datenobjekts vom Typ c bzw. x betroffen.
Bei der Deserialiierung hat das Attribut minLength keine Wirkung. Mit dem Attribut maxLength bzw. length wird die maximale Anzahl an Zeichen bzw. Bytes festgelegt, die im XML-Wert erwartet werden. Wenn der zu deserialisierende XML-Wert mehr Zeichen oder Bytes enthält als durch length angegeben, kommt es zur Ausnahme CX_ST_CONSTRAINT_ERROR, außer es sind nur schließende Leerzeichen oder Null-Bytes bei der Deserialisierung in ein Datenobjekt vom Typ c bzw. x betroffen.
Die Ausnahme CX_ST_CONSTRAINT_ERROR kann beim Aufruf von CALL TRANSFORMATION nicht direkt abgefangen werden, sondern ist in CX_ST_SERIALIZATION_ERROR bzw. CX_ST_DESERIALIZATION_ERROR verpackt.
Die folgende Transformation führt Serialisierung und Deserialisierung mit unterschiedlichen Längenangaben aus:
<?sap.transform simple?>
<tt:transform
xmlns:tt="http://www.sap.com/transformation-templates">
<tt:root name="ROOT"/>
<tt:template>
<tt:serialize>
<Text>
<tt:value length="8" ref="ROOT"/>
</Text>
</tt:serialize>
<tt:deserialize>
<Text>
<tt:value length="4" ref="ROOT"/>
</Text>
</tt:deserialize>
</tt:template>
</tt:transform>
Folgendes ABAP-Programm kann die Transformation aufrufen:
DATA: text TYPE
string VALUE `1234`,
xml_xstring TYPE string,
exc_trafo TYPE REF TO
cx_transformation_error,
exc_prev TYPE
REF TO cx_root.
CALL TRANSFORMATION ...
SOURCE root = text
RESULT XML xml_xstring.
cl_abap_browser=>show_xml( xml_string = xml_xstring
modal = 'X' ).
TRY.
CALL TRANSFORMATION
... SOURCE XML xml_xstring
RESULT root = text.
CATCH cx_st_deserialization_error
INTO exc_trafo.
MESSAGE
exc_trafo TYPE 'I' DISPLAY LIKE 'E'.
IF
exc_trafo->previous IS NOT INITIAL.
exc_prev = exc_trafo->previous.
MESSAGE
exc_prev TYPE 'I' DISPLAY LIKE 'E'.
ENDIF.
ENDTRY.
Das Ergebnis der Transformation ist:
<Text>1234 </Text>
Da bei der Deserialisierung mehr Zeichen als erwartet übertragen werden, kommt es zur Ausnahme CX_ST_CONSTRAINT_ERROR, die in die Ausnahme CX_ST_DESERIALIZATION_ERROR verpackt ist.