Transformeer tagwaarde naar tagnaam (XSL): verschil tussen versies

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen
Regel 58: Regel 58:
 
<FreeText_number_3>Veld_03</FreeText>
 
<FreeText_number_3>Veld_03</FreeText>
 
<FreeText_number_4>      </FreeText_number_4>
 
<FreeText_number_4>      </FreeText_number_4>
 +
</pre>
 +
 +
== Voorbeeld Stack Overflow ===
 +
 +
[https://stackoverflow.com/questions/19776971/convert-string-value-as-xml-tag-name]:
 +
 +
=== XML - invoer ===
 +
 +
<pre>
 +
<Policy>
 +
    <Attributes>
 +
        <AttributeName>is_policy_loan</AttributeName>
 +
        <AttributeValue>Yes</AttributeValue>
 +
    </Attributes>
 +
    <Attributes>
 +
        <AttributeName>is_policy_owners</AttributeName>
 +
        <AttributeValue>Yes</AttributeValue>
 +
    </Attributes>     
 +
    <Attributes>
 +
        <AttributeName>is_policy_twoyears</AttributeName>
 +
        <AttributeValue>Yes</AttributeValue>
 +
    </Attributes>     
 +
</Policy>
 +
</pre>
 +
 +
=== XSL ===
 +
 +
<pre>
 +
<?xml version="1.0" encoding="UTF-8"?>
 +
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
 +
<xsl:output method="xml" indent="yes" encoding="UTF-8" omit-xml-declaration="yes" />
 +
 +
 +
<!-- =========================================== -->
 +
<!-- Identity Transformation                    -->
 +
<!-- =========================================== -->
 +
<!--                                            -->
 +
<!-- Looks a bit strange, but probably is the    -->
 +
<!-- exact same: All data is being copied        -->
 +
 +
<xsl:template match="Policy">
 +
  <xsl:element name="Policy">
 +
    <xsl:apply-templates />
 +
  </xsl:element>
 +
</xsl:template>
 +
 +
 +
<!-- =========================================== -->
 +
<!-- Alle attributen omfietsen naar subelementen -->
 +
<!-- =========================================== -->
 +
 +
 +
<!-- Limited template to "Attributes" nodes      -->
 +
<!-- =========================================== -->
 +
<!--                                            -->
 +
<xsl:template match="Attributes">
 +
 +
 +
<!-- Initiate variable "name"                    -->
 +
<!-- =========================================== -->
 +
<!--                                            -->
 +
<!-- * https://www.w3schools.com/xml/ref_xsl_el_variable.asp -->
 +
<!-- * Within <Attributes>, there is only one    -->
 +
<!--  field <AttributeValue>                    -->
 +
<!--                                            -->
 +
  <xsl:variable name="name" select="AttributeName" />
 +
 +
 +
 +
<!-- Dynamically create element                  -->
 +
<!-- =========================================== -->
 +
<!--                                            -->
 +
<!-- * https://www.w3schools.com/xml/ref_xsl_el_element.asp -->
 +
<!--                                            -->
 +
  <xsl:element name="{$name}">
 +
 +
<!-- Here's the value of the other field fetched -->
 +
<!--                                            -->
 +
<xsl:value-of select="AttributeValue" />
 +
 
 +
  </xsl:element>
 +
 +
 +
<!-- Close template                              -->
 +
<!--                                            -->
 +
</xsl:template>
 +
 +
 +
</xsl:stylesheet>
 
</pre>
 
</pre>
  
Regel 63: Regel 152:
  
 
* https://www.google.nl/search?q=xsl+transform+value+to+tag+name
 
* https://www.google.nl/search?q=xsl+transform+value+to+tag+name
 +
* https://www.w3schools.com/xml/ref_xsl_el_variable.asp

Versie van 19 apr 2018 15:34

Het probleem

In testbestand

<?xml version="1.0"?>
<Items>
	<Item><Item_code>00000001</Item_code><Item_type>S</Item_type>
		<Description>Dinges_01</Description>
		<FreeFields>
  			<FreeTexts>
				<FreeText><FreeText_number>1</FreeText_number></FreeText>
				<FreeText><FreeText_number>2</FreeText_number>Veld_02</FreeText>
				<FreeText><FreeText_number>3</FreeText_number>Veld_03</FreeText>
				<FreeText><FreeText_number>4</FreeText_number></FreeText>
			</FreeTexts>
		</FreeFields>
	</Item>

	<Item><Item_code>00000002</Item_code><Item_type>S</Item_type>
		<Description>Widget_01</Description>
		<FreeFields>
  			<FreeTexts>
				<FreeText><FreeText_number>1</FreeText_number></FreeText>
				<FreeText><FreeText_number>2</FreeText_number>Field_02</FreeText>
				<FreeText><FreeText_number>3</FreeText_number>Field_03</FreeText>
				<FreeText><FreeText_number>4</FreeText_number></FreeText>
			</FreeTexts>
		</FreeFields>
	</Item>	
</Items>

wil ik

<FreeText><FreeText_number>1</FreeText_number></FreeText>
<FreeText><FreeText_number>2</FreeText_number>Veld_02</FreeText>
<FreeText><FreeText_number>3</FreeText_number>Veld_03</FreeText>
<FreeText><FreeText_number>4</FreeText_number></FreeText>

omfietsen naar

<FreeText><FreeText_number_1>1</FreeText_number_1></FreeText>
<FreeText><FreeText_number_2>2</FreeText_number_2>Veld_02</FreeText>
<FreeText><FreeText_number_3>3</FreeText_number_3>Veld_03</FreeText>
<FreeText><FreeText_number_4>4</FreeText_number_4></FreeText>

en uiteindelijk naar

<FreeText_number_1>       </FreeText_number_1>
<FreeText_number_2>Veld_02</FreeText_number_2>
<FreeText_number_3>Veld_03</FreeText>
<FreeText_number_4>       </FreeText_number_4>

Voorbeeld Stack Overflow =

[1]:

XML - invoer

<Policy>
    <Attributes>
        <AttributeName>is_policy_loan</AttributeName>
        <AttributeValue>Yes</AttributeValue>
    </Attributes>
    <Attributes>
        <AttributeName>is_policy_owners</AttributeName>
        <AttributeValue>Yes</AttributeValue>
    </Attributes>       
    <Attributes>
        <AttributeName>is_policy_twoyears</AttributeName>
        <AttributeValue>Yes</AttributeValue>
    </Attributes>       
</Policy>

XSL

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" indent="yes" encoding="UTF-8" omit-xml-declaration="yes" />


<!-- =========================================== -->
<!-- Identity Transformation                     -->
<!-- =========================================== -->
<!--                                             -->
<!-- Looks a bit strange, but probably is the    -->
<!-- exact same: All data is being copied        -->

<xsl:template match="Policy">
  <xsl:element name="Policy">
     <xsl:apply-templates />
  </xsl:element>
</xsl:template>


<!-- =========================================== -->
<!-- Alle attributen omfietsen naar subelementen -->
<!-- =========================================== -->


<!-- Limited template to "Attributes" nodes      -->
<!-- =========================================== -->
<!--                                             -->
<xsl:template match="Attributes">


	<!-- Initiate variable "name"                    -->
	<!-- =========================================== -->
	<!--                                             -->
	<!-- * https://www.w3schools.com/xml/ref_xsl_el_variable.asp -->
	<!-- * Within <Attributes>, there is only one    -->
	<!--   field <AttributeValue>                    -->
	<!--                                             -->
  	<xsl:variable name="name" select="AttributeName" />



	<!-- Dynamically create element                  -->
	<!-- =========================================== -->
	<!--                                             -->
	<!-- * https://www.w3schools.com/xml/ref_xsl_el_element.asp -->
	<!--                                             -->
  <xsl:element name="{$name}">

	<!-- Here's the value of the other field fetched -->
	<!--                                             -->
	<xsl:value-of select="AttributeValue" />
  
  </xsl:element>


<!-- Close template                              -->
<!--                                             -->
</xsl:template>


</xsl:stylesheet>

Bronnen