按顺序使用模板的 XSL 转换



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

输入.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>

变压器.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>

使用 XSLT 3 和 parse-xml 函数 (https://www.w3.org/TR/xpath-functions-31/#func-parse-xml),您可以使用以下方法输出在P_INVOICE原始输入中转义的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>

相关内容

  • 没有找到相关文章

最新更新