From 7769f699c885230967be1820cc7bc836685b25fd Mon Sep 17 00:00:00 2001 From: danrega <16720986+danrega@users.noreply.github.com> Date: Wed, 31 Jan 2024 15:40:37 +0100 Subject: [PATCH] Update --- 01_Internal_Tables.md | 8 +- 07_String_Processing.md | 6 +- 08_EML_ABAP_for_RAP.md | 12 +- 17_SAP_LUW.md | 72 +++++++- 22_Misc_ABAP_Classes.md | 159 ++++++++++++++++-- ...demo_abap_st_carriers_html.xslt.source.xml | 54 +++++- src/zdemo_abap_st_carriers_html.xslt.xml | 2 +- src/zdemo_abap_st_strtab_html.xslt.source.xml | 27 ++- src/zdemo_abap_st_strtab_html.xslt.xml | 2 +- src/zdemo_abap_xslt_flights.xslt.source.xml | 28 ++- 10 files changed, 325 insertions(+), 45 deletions(-) diff --git a/01_Internal_Tables.md b/01_Internal_Tables.md index 64464be..667c7a0 100644 --- a/01_Internal_Tables.md +++ b/01_Internal_Tables.md @@ -410,9 +410,8 @@ SELECT * FROM zdemo_abap_fli INTO TABLE @FINAL(it_inline5). ## Filling and Copying Internal Tables You can use the ABAP keywords -[`APPEND`](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abapappend.htm) -and [`INSERT`](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abapinsert_itab.htm) +and [`APPEND`](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abapappend.htm) to add lines to internal tables.
@@ -449,6 +448,7 @@ to add lines to internal tables. - Note: In the case of unique primary table keys, the table cannot have entries with duplicate keys. If a duplicate is inserted, the insertion fails and the system field `sy-subrc` is set to 4. +- What to use? The recommendation is the `INSERT` statement. It covers all table and key types. Consider potential issues when you change table/key types, and you use `APPEND` in your code.

@@ -879,9 +879,9 @@ The following code snippets include [`READ TABLE`](https://help.sap.com/doc/abap using `REFERENCE INTO`. In this case, no copying takes place. If you want to address the line, you must first [dereference](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abendereferencing_operat_glosry.htm) the data reference. You cannot use the addition `TRANSPORTING`. ``` abap - READ TABLE itab REFERNCE INTO dref ... + READ TABLE itab REFERENCE INTO dref ... - READ TABLE itab REFERNCE INTO DATA(dref_inl) ... + READ TABLE itab REFERENCE INTO DATA(dref_inl) ... ``` **Which to use then?** Since all syntax options provide the same diff --git a/07_String_Processing.md b/07_String_Processing.md index f2234e8..a43b173 100644 --- a/07_String_Processing.md +++ b/07_String_Processing.md @@ -1921,7 +1921,7 @@ DATA(conc_str1) = xco_cp=>strings( str_table )->join( `, ` )->value. "Concatenating a string table into a string; specifying a delimiter and "reversing the table order "c / b / a -DATA(conc_str2) = xco_cp=>strings( str_table )->reverse( )->join( ` / ` )->value. +DATA(conc_str2) = xco_cp=>strings( str_table )->reverse( )->join( ` / ` )->value. "--------- Prepending and appending strings --------- DATA(name) = xco_cp=>string( `Max Mustermann` ). @@ -1934,10 +1934,10 @@ DATA(title) = name->prepend( `Mr. ` )->value. "--------- Transforming to lowercase and uppercase --------- "ABAP -DATA(to_upper) = xco_cp=>string( `abap` )->to_upper_case( )->value. +DATA(to_upper) = xco_cp=>string( `abap` )->to_upper_case( )->value. "hallo world -DATA(to_lower) = xco_cp=>string( `HALLO WORLD` )->to_lower_case( )->value. +DATA(to_lower) = xco_cp=>string( `HALLO WORLD` )->to_lower_case( )->value. "--------- Checking if a string starts/ends with a specific string --------- DATA check TYPE string. diff --git a/08_EML_ABAP_for_RAP.md b/08_EML_ABAP_for_RAP.md index ed9b392..4f2a8f1 100644 --- a/08_EML_ABAP_for_RAP.md +++ b/08_EML_ABAP_for_RAP.md @@ -218,7 +218,7 @@ Some of the syntax examples are commented out, just for the sake of showing more //(which restrict/enable further specifications) //You can specifiy one or more implementation classes (behavior pools/ABPs -> bp...) //for the RAP BO (in some contexts, specifying no ABP is possible). -//Specifying unique is mandatory (each operation can only implemented once). +//Specifying unique is mandatory (each operation can only be implemented once). managed implementation in class bp_some_demo unique; //For managed RAP BOs, you can enable user-defined saving options (optional additions //are available). @@ -336,7 +336,7 @@ authorization master ( instance ) //Draft actions //Available for draft-enabled RAP BOs, allow data modification on the draft table; are //implicitly available; it is recommended for the draft actions to be specified explicitly; - //for some of the methods the 'with additional implementation' is available + //for some of the methods, the 'with additional implementation' addition is available //Copies active instances to the draft table //draft action Edit; @@ -1305,7 +1305,7 @@ ENDIF. ### Raising RAP Business Events - [RAP business events](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenrap_entity_event_glosry.htm) can be raised in ABAP behavior pools with [`RAISE ENTITY EVENT`](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abapraise_entity_event.htm) statements. -- Prerequisites: +- The focus of the snippets is on the local consumption of RAP business events. Prerequisites: - `event` specifications are available in the BDEF (e.g. `... event some_evt; ...`). For more details, refer to the [BDL documentation](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenbdl_event.htm) - A [RAP event handler class](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenrap_event_handler_class_glosry.htm) is available that is used to implement [RAP event handler methods](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenrap_event_handler_meth_glosry.htm). - Note that these methods are called asynchronously. @@ -1334,10 +1334,10 @@ ENDCLASS. "- This type includes the keys of RAP BO instances (and %param, if the event " is specified with a parameter in the BDEF) "- The methods do not contain RAP response parameters. -METHODS meth FOR ENTITY EVENT par FOR some_b.def~some_evt. +METHODS meth FOR ENTITY EVENT par FOR some_bdef~some_evt. "---- RAISE ENTITY EVENT statement in an ABP, e.g. the save_modified method ---- -"---- in managed scenarios 'with additional save' ---- +"---- in managed scenarios with additional save ---- ... CLASS lsc IMPLEMENTATION. METHOD save_modified. @@ -1713,7 +1713,7 @@ This cheat sheet is supported by different executable examples demonstrating var > **💡 Note**
> - To reduce the complexity, the executable examples only focus on the technical side. ABAP classes play the role of a RAP BO consumer here. > - The examples do not represent real life scenarios and are not suitable as role models for proper RAP scenarios. They rather focus on the technical side by giving an idea how the communication and data exchange between a RAP BO consumer and RAP BO provider can work. Additionally, the examples show how the methods for non-standard RAP BO operations might be self-implemented in an ABAP behavior pool. -> - Due to the simplification, the examples do not fully meet the requirements of the [RAP BO contract](https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/index.htm?file=abenrap_bo_contract_glosry.htm) in many respects. +> - Due to the simplification, the examples do not entirely meet all requirements of the [RAP BO contract](https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/index.htm?file=abenrap_bo_contract_glosry.htm) and do not represent semantic or best practice examples. > - You can check out the "RAP calculator" example using the preview version of an SAP Fiori Elements UI. See the comments in the class for more information. > - The steps to import and run the code are outlined [here](README.md#-getting-started-with-the-examples). > - [Disclaimer](README.md#%EF%B8%8F-disclaimer) diff --git a/17_SAP_LUW.md b/17_SAP_LUW.md index 8fa4f03..7e29e18 100644 --- a/17_SAP_LUW.md +++ b/17_SAP_LUW.md @@ -8,7 +8,8 @@ - [Bundling Techniques](#bundling-techniques) - [Related ABAP Statements](#related-abap-statements) - [Concepts Related to the SAP LUW](#concepts-related-to-the-sap-luw) - - [Notes on the SAP LUW in ABAP Cloud and RAP](#notes-on-the-sap-luw-in-abap-cloud-and-rap) + - [The SAP LUW in ABAP Cloud and RAP](#the-sap-luw-in-abap-cloud-and-rap) + - [Controlled SAP LUW](#controlled-sap-luw) - [More Information](#more-information) - [Executable Example](#executable-example) @@ -279,7 +280,7 @@ The following concepts are related to the SAP LUW to ensure transactional consis

⬆️ back to top

-## Notes on the SAP LUW in ABAP Cloud and RAP +## The SAP LUW in ABAP Cloud and RAP A limited set of ABAP language features is available in ABAP Cloud ([restricted ABAP language version](https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/index.htm?file=abenrestricted_version_glosry.htm)). The limitations include the fact that the above bundling techniques are not available. Note that the local update is enabled by default in ABAP Cloud. Find more information in this [blog](https://blogs.sap.com/2022/12/05/the-sap-luw-in-abap-cloud/). @@ -292,6 +293,73 @@ There are RAP-specific [ABAP EML](https://help.sap.com/doc/abapdocu_latest_index - [`ROLLBACK ENTITIES`](https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/index.htm?file=abaprollback_entities.htm): Resets all changes of the current transaction and clears the transactional buffer. The statement triggers `ROLLBACK WORK`. - Find more information in the [ABAP cheat sheet about EML](08_EML_ABAP_for_RAP.md). +

⬆️ back to top

+ +## Controlled SAP LUW + +- The *controlled SAP LUW* is an enhancement to the SAP LUW concept. +- It introduces a check mechanism to detect violations of [transactional contracts](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abentransactional_contract_glosry.htm) to guarantee transactional consistency. +- Such contracts specify which ABAP statements and operations are allowed and which are not allowed in a [transactional phase](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abentr_phase_glosry.htm). +- In this way, applications can be made more robust and the SAP LUW can be made more tangible. +- Violations that are detected result in a runtime error (or are logged). +- There are mainly two transactional phases: *modify* and *save*. +- In RAP, these two phases are set implicitly, and they are subdivided as follows (see more information in the EML cheat sheet and the RAP guide): + - *modify* + - [RAP interaction phase](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenrap_int_phase_glosry.htm) + - [RAP early save phase](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenearly_rap_save_phase_glosry.htm) + - *save* + - [RAP late save phase](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenlate_rap_save_phase_glosry.htm) +- Using the static methods `modify` and `save` of the `CL_ABAP_TX` class, you can activate the transactional phases explicitly. +- The controlled SAP LUW is automatically and implicitly supported by newer ABAP concepts such as RAP (i.e. the transactional phases are implicitly active when RAP handler methods are called), [background Processing Framework (bgPF)](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenbgpf_glosry.htm), and local consumption of [RAP business events](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenrap_entity_event_glosry.htm). +- Furthermore, transactional contracts define where (i. e. in which transactional phase) a [classified API](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenclassified_api_glosry.htm), such as a method of a class, can be used. The classifications start with `IF_ABAP_TX_...`, for example, `IF_ABAP_TX_SAVE`, and are, in the case of methods, typcially included as types in the local types of the class ([CCDEF include](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenccdef_glosry.htm), *Class-Relevant Local Types* tab in ADT). The classifications detail out and restrict the scope of use, so as not to use a classified API in phases where not allowed. Follow the links below for more information. + - Example of a classified API: Open the class `CL_BCS_MAIL_MESSAGE` (which is used for sending emails). In ADT, go to the *Class-Relevant Local Types* tab, and find classifications for methods, for example, the `send_async` method. Calling this method in the *modify* transactional phase results in a violation. You can also get information about the transactional contract using the F2 information in ADT. In the case of the method mentioned, choose F2 on `send_async` (`... cl_bcs_mail_message=>create_instance( ... )->send_async( ). ...`) to view the transactional contract information. +- Regarding the concrete restrictions and for more information, follow the links. +- Examples for violations, such as database modifications. They are only allowed in the *save* transactional phase because the data being processed in the *modify* phase may be inconsistent: + - Database modification (e.g. `MODIFY dbtab FROM @row.`) performed when the *modify* transactional phase is active. + - Database modifcation in a [RAP handler method](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenabp_handler_method_glosry.htm) implementation. Here, the *modify* transactional phase is active by default. + - Database modifcation in a [RAP event handler method](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenrap_event_handler_meth_glosry.htm) implementation when the *save* transactional phase has not been activated explicitly. Note: When RAP event handler methods are called, they are started in the *modify* transactional phase. Modifying a database right away there, without the activation of the *save* phase, means a violation. + - Calling a classified API in a phase where not allowed, such as `... cl_bcs_mail_message=>create_instance( ... )->send_async( ). ...` (classified with `IF_ABAP_TX_SAVE`) in the *modify* transactional phase. +- More information: + - [Controlled SAP LUW](https://help.sap.com/docs/abap-cloud/abap-concepts/controlled-sap-luw) in the SAP Help Portal + - ABAP Keyword Documentation (Standard ABAP): + - [Restrictions in Transactional Phases](https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/index.htm?file=abapinvalid_stmts_in_tx.htm) + - [API Classifications](https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/index.htm?file=abapapi_classification.htm) + - [Restrictions in RAP Handler and Saver Methods](https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/index.htm?file=abapinvalid_stmts_in_rap_methods.htm) + + +Example using `CL_ABAP_TX`: + +```abap +... + +"Activating the modify transactional phase +cl_abap_tx=>modify( ). + +"The following database modification statement is not allowed in the +"modify transactional phase. In certain contexts, e.g. in ABAP Cloud, +"the runtime error BEHAVIOR_ILLEGAL_STMT_IN_CALL occurs. +MODIFY zdemo_abap_carr FROM TABLE @( VALUE #( + ( carrid = 'XY' + carrname = 'XY Airlines' + currcode = 'EUR' + url = 'some_url' ) ) ). + +... + +"Activating the save transactional phase +cl_abap_tx=>save( ). + +"In this phase, database modifications are allowed. +MODIFY zdemo_abap_carr FROM TABLE @( VALUE #( + ( carrid = 'XY' + carrname = 'XY Airlines' + currcode = 'EUR' + url = 'some_url' ) ) ). +... +``` + +

⬆️ back to top

+ ## More Information - [The RAP Transactional Model and the SAP LUW](https://help.sap.com/docs/SAP_S4HANA_CLOUD/e5522a8a7b174979913c99268bc03f1a/ccda1094b0f845e28b88f9f50a68dfc4.html) (Development guide for the ABAP RESTful Application Programming Model) - [The SAP LUW in ABAP Cloud](https://blogs.sap.com/2022/12/05/the-sap-luw-in-abap-cloud/) (blog) diff --git a/22_Misc_ABAP_Classes.md b/22_Misc_ABAP_Classes.md index 6f192f6..9c95601 100644 --- a/22_Misc_ABAP_Classes.md +++ b/22_Misc_ABAP_Classes.md @@ -623,18 +623,6 @@ ENDTRY. "xstring -> string DATA(conv_string) = cl_abap_conv_codepage=>create_in( )->convert( conv_xstring ). "Hello world - -"As an alternative, you can use methods of the XCO library. More methods are available -"in this context. Check the options when choosing CTRL + Space after '->' -"string -> xstring -DATA(conv_xstring_xco) = xco_cp=>string( hi - )->as_xstring( xco_cp_character=>code_page->utf_8 - )->value. - -"xstring -> string -DATA(conv_string_xco) = xco_cp=>xstring( conv_xstring_xco - )->as_string( xco_cp_character=>code_page->utf_8 - )->value. ``` @@ -671,6 +659,153 @@ DATA(res) = cl_abap_regex=>create_pcre( pattern = `\s\w` "Any blank f ignore_case = abap_true )->create_matcher( text = str )->find_all( ). ``` + + + + XCO_CP + +Offers various options to process strings using the XCO Library; see a selection in the code snippet +

+ +``` abap +"--------- Extracting a substring from a string --------- +DATA(some_string) = `abcdefghijklmnopqrstuvwxyz`. + +"Creating an encapsulation of a string using XCO +DATA(str) = xco_cp=>string( some_string ). + +"Using the FROM and TO methods, you can determine +"the character position. Note that the value includes the +"character at the position specified. +"The character index pattern for the example string above +"is (the string has 26 characters in total): +"a = 1, b = 2, c = 3 ... z = 26 +"a = -26, b = -25, c = -24 ... z = -1 +"Providing a value that is out of bounds means that +"the first (or the last) character of the string is used +"by default. +"Note: When combining FROM and TO, e.g. with method +"chaining ...->from( ...)->to( ... ), note that another +"instance is created with the first 'from', and another +"character index pattern is created based on the new +"and adjusted string value. + +"bcdefghijklmnopqrstuvwxyz +DATA(sub1) = str->from( 2 )->value. + +"defghijklmnopqrstuvwxyz +DATA(sub2) = str->from( -23 )->value. + +"vwxyz +DATA(sub3) = str->from( -5 )->value. + +"abcde +DATA(sub4) = str->to( 5 )->value. + +"ab +DATA(sub5) = str->to( -25 )->value. + +"Result of 1st 'from' method call: bcdefghijklmnopqrstuvwxyz +"Based on this result, the 'to' method call is +"applied. +"bcdefg +DATA(sub6) = str->from( 2 )->to( 6 )->value. + +"Result of 1st 'to' method call: abcdefghijklmnopq +"Based on this result, the 'from' method call is +"applied. +"defghijklmnopq +DATA(sub7) = str->to( -10 )->from( 4 )->value. + +"Values that are out of bounds. +"In the example, the first and last character of the +"string are used. +"abcdefghijklmnopqrstuvwxyz +DATA(sub8) = str->from( 0 )->to( 100 )->value. + +"--------- Splitting and joining --------- + +"Splitting a string into a string table +DATA(str_table) = xco_cp=>string( `Hello.World.ABAP` )->split( `.` )->value. +"Hello +"World +"ABAP + +"Concatenating a string table into a string; specifying a delimiter +str_table = VALUE #( ( `a` ) ( `b` ) ( `c` ) ). +"a, b, c +DATA(conc_str1) = xco_cp=>strings( str_table )->join( `, ` )->value. + +"Concatenating a string table into a string; specifying a delimiter and +"reversing the table order +"c / b / a +DATA(conc_str2) = xco_cp=>strings( str_table )->reverse( )->join( ` / ` )->value. + +"--------- Prepending and appending strings --------- +DATA(name) = xco_cp=>string( `Max Mustermann` ). + +"Max Mustermann, Some Street 1, 12345 Someplace +DATA(address) = name->append( `, Some Street 1, 12345 Someplace` )->value. + +"Mr. Max Mustermann +DATA(title) = name->prepend( `Mr. ` )->value. + +"--------- Transforming to lowercase and uppercase --------- +"ABAP +DATA(to_upper) = xco_cp=>string( `abap` )->to_upper_case( )->value. + +"hallo world +DATA(to_lower) = xco_cp=>string( `HALLO WORLD` )->to_lower_case( )->value. + +"--------- Checking if a string starts/ends with a specific string --------- +DATA check TYPE string. +DATA(str_check) = xco_cp=>string( `Max Mustermann` ). + +"yes +IF str_check->ends_with( `mann` ). + check = `yes`. +ELSE. + check = `no`. +ENDIF. + +"no +IF str_check->starts_with( `John` ). + check = `yes`. +ELSE. + check = `no`. +ENDIF. + +"--------- Converting strings to xstrings using a codepage --------- +"536F6D6520737472696E67 +DATA(xstr) = xco_cp=>string( `Some string` )->as_xstring( xco_cp_character=>code_page->utf_8 )->value. + +"--------- Camel case compositions and decompositions with split and join operations --------- +"Pascal case is also possible +"someValue +DATA(comp) = xco_cp=>string( `some_value` )->split( `_` )->compose( xco_cp_string=>composition->camel_case )->value. + +"Camel case decomposition +"some_value +DATA(decomp) = xco_cp=>string( `someValue` )->decompose( xco_cp_string=>decomposition->camel_case )->join( `_` )->value. + +"--------- Matching string against regular expression --------- +DATA match TYPE string. + +"yes +IF xco_cp=>string( ` 1` )->matches( `\s\d` ). + match = 'yes'. +ELSE. + match = 'no'. +ENDIF. + +"no +IF xco_cp=>string( ` X` )->matches( `\s\d` ). + match = 'yes'. +ELSE. + match = 'no'. +ENDIF. +``` + diff --git a/src/zdemo_abap_st_carriers_html.xslt.source.xml b/src/zdemo_abap_st_carriers_html.xslt.source.xml index 5b5d1ef..d5f590a 100644 --- a/src/zdemo_abap_st_carriers_html.xslt.source.xml +++ b/src/zdemo_abap_st_carriers_html.xslt.source.xml @@ -1,7 +1,49 @@ - -

Information about Carriers

- - - -
IDNameCurrencyWebsite
+ + + + + + + + +

Information about Carriers

+ + + + + + + + + + + + + + + +
+ ID + + Name + + Currency + + Website +
+ + + + + + + + + + +
+ + +
+
diff --git a/src/zdemo_abap_st_carriers_html.xslt.xml b/src/zdemo_abap_st_carriers_html.xslt.xml index b8b5dbe..64a58a6 100644 --- a/src/zdemo_abap_st_carriers_html.xslt.xml +++ b/src/zdemo_abap_st_carriers_html.xslt.xml @@ -5,7 +5,7 @@ ZDEMO_ABAP_ST_CARRIERS_HTML E - Simple Transformation Demo + ST Demo diff --git a/src/zdemo_abap_st_strtab_html.xslt.source.xml b/src/zdemo_abap_st_strtab_html.xslt.source.xml index 0a3ed04..c803894 100644 --- a/src/zdemo_abap_st_strtab_html.xslt.source.xml +++ b/src/zdemo_abap_st_strtab_html.xslt.source.xml @@ -1,4 +1,23 @@ - -

Content of String Table

-
-
+ + + + + + + + +

Content of String Table

+ + + + + + +
+ +
+ + +
+ +
diff --git a/src/zdemo_abap_st_strtab_html.xslt.xml b/src/zdemo_abap_st_strtab_html.xslt.xml index 51bfca2..46fc5d9 100644 --- a/src/zdemo_abap_st_strtab_html.xslt.xml +++ b/src/zdemo_abap_st_strtab_html.xslt.xml @@ -5,7 +5,7 @@ ZDEMO_ABAP_ST_STRTAB_HTML E - Simple Transformation Demo + ST Demo diff --git a/src/zdemo_abap_xslt_flights.xslt.source.xml b/src/zdemo_abap_xslt_flights.xslt.source.xml index c084b86..fdb1bb8 100644 --- a/src/zdemo_abap_xslt_flights.xslt.source.xml +++ b/src/zdemo_abap_xslt_flights.xslt.source.xml @@ -1,6 +1,22 @@ - - - - - - + + + + + + + + + + + + + + + + + + + + + +