How to apply XSLT transformations to XML file and produce another XML?

雨燕双飞 提交于 2019-12-13 09:46:48

问题


Input.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<output>
    <orders>
        <order>
            <id>1</id>
            <number>10002</number>
            <type>Loading</type>
            <date>2013-01-01T02:30:00</date>
        </order>
        <order>
            <id>2</id>
            <number>10003</number>
            <type>Loading</type>
            <date>2013-01-01T010:30:00</date>
        </order>

    </orders>
    <quantities>
        <quantity>
            <id_order>1</id_order>
            <unit>KG</unit>
            <value>1000</value>
        </quantity>
        <quantity>
            <id_order>2</id_order>
            <unit>PAL</unit>
            <value>3</value>
        </quantity>

    </quantities>
</output>

Output.xml should look like this

<?xml version="1.0" encoding="ISO-8859-1"?>
<output>
    <orders>
        <order>
            <id>1</id>
            <number>10002</number>
            <type>Loading</type>
            <KG>1000</KG>
            <PAL>3</PAL>
            <M3>1.5</M3>
        </order>
        <order>
            <id>2</id>
            <number>10003</number>
            <type>Loading</type>
            <KG>2000</KG>
            <PAL>4</PAL>
        </order>

    </orders>
</output>

What is the format of XSLT file I need to apply ?

ps: ignore this line, sTu!"#id SO asks me to write more text in this post thinking its all code. ignore this line, sTu!"#id SO asks me to write more text in this post thinking its all code.


回答1:


The following XSLT does what you need (except formatting):

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="xml" indent="yes" encoding="iso-8859-1"/>

    <!-- Copy all elements recursively -->
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <!-- Copy this element with subelements -->
    <xsl:template match="order">
        <!-- Save ID for queries -->
        <xsl:variable name="id" select="id" />
        <xsl:copy>
          <xsl:apply-templates select="@* | node()"/>
          <!-- Find all quantity elements by ID -->
          <xsl:for-each select="//quantity[id_order=$id]">
              <!-- Create element with name set to value of unit element and value of value element -->
              <xsl:element name="{unit}">
                  <xsl:value-of select="value"/>              
              </xsl:element>
          </xsl:for-each>
        </xsl:copy>
    </xsl:template>

    <!-- Skip these elements -->
    <xsl:template match="quantities" />
    <xsl:template match="date" />
</xsl:stylesheet>

RESULT

<?xml version="1.0" encoding="UTF-8"?>
<output>
   <orders>
      <order>
         <id>1</id>
         <number>10002</number>
         <type>Loading</type>
         <KG>1000</KG>
      </order>
      <order>
         <id>2</id>
         <number>10003</number>
         <type>Loading</type>
         <PAL>3</PAL>
      </order>
   </orders>
</output>


来源:https://stackoverflow.com/questions/24516772/how-to-apply-xslt-transformations-to-xml-file-and-produce-another-xml

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!