按顺序使用模板的XSL转换

时间:2017-11-01 14:33:52

标签: xslt xslt-1.0 xslt-2.0

如何按顺序使用两个模板转换XML? 例如,我有一个XML中包含字符串XML ,因此我需要将此字符串XML 转换为XML,之后我需要删除发票节点。

input.xml中

<?xml version="1.0" encoding="UTF-8"?>
<MT_STATEMENT_response >
  <Statement_response>
    <P_INVOICE>
        &lt;invoices&gt;
          &lt;invoice&gt;
             &lt;number&gt;12345&lt;/number&gt;
             &lt;status/&gt;
          &lt;/invoice&gt;
          &lt;invoice&gt;
             &lt;number&gt;67890&lt;/number&gt;
             &lt;status/&gt;
          &lt;/invoice&gt;
       &lt;/invoices&gt;
    </P_INVOICE>
  </Statement_response>
</MT_STATEMENT_response>

transformer.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext">
  <xsl:output omit-xml-declaration="yes" indent="yes" />

  <xsl:template match="/*">
      <xsl:variable name="t1">
        <xsl:apply-templates select="Statement_response" />
      </xsl:variable>

      <xsl:apply-templates mode="pass2" select="ext:node-set($t1)/*" />
  </xsl:template>

  <xsl:template match="Statement_response">
    <xsl:value-of select="." disable-output-escaping="yes" />
  </xsl:template>

  <xsl:template match="invoices" mode="pass2">
    <xsl:value-of select="." disable-output-escaping="yes" />
  </xsl:template>
</xsl:stylesheet>

预期

<invoice>
  <number>12345</number>
  <status/>
</invoice>
<invoice>
  <number>67890</number>
  <status/>
</invoice>

1 个答案:

答案 0 :(得分:0)

使用XSLT 3和parse-xml函数(https://www.w3.org/TR/xpath-functions-31/#func-parse-xml),您可以使用

输出invoice元素中原始输入中转义的P_INVOICE个元素
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math"
    exclude-result-prefixes="xs math"
    version="3.0">

    <xsl:template match="/">
        <xsl:copy-of select="parse-xml(//P_INVOICE)//invoice"/>
    </xsl:template>

</xsl:stylesheet>