无法访问 XSLT 处理器 3.0 中已解析的未转义 XML 的子元素

问题描述 投票:0回答:1

使用 Saxon-HE 10.9 和 XSLT 3.0,我尝试转换嵌入在较大 XML 文件中的未转义 XML 字符串。我通过使用完成了这个

   <xsl:template match="INTERNAL_MATCH" mode="dataset">
      <xsl:variable name="unescapedXML" select="parse-xml(.)"/>
      <TESTVAL>
         <xsl:element name="output-params2">
            <xsl:copy-of select="//$unescapedXML" />
         </xsl:element>
      </TESTVAL> 
   </xsl:template>

输出如下:

        <TESTVAL>
            <output-params2>
               <product ism:ownerProducer="USA">
                  <name>Test Product</name>
                  <shortName>TP</shortName>
                  <base type="testtype" id="1235"/>
                  <base type="testtype2" id="1236"/>
               </product>
            </output-params2>
        </TESTVAL>

但是,我想访问此输出的子节点,而不是能够按类型解析基本元素,if type = 'testtype',然后将其 id 存储为变量。

我该如何实现这个目标?我尝试做访问器

<xsl:copy-of select="//$unescapedXML/product/base" />

但它什么也没返回。

xml xslt saxon
1个回答
0
投票

按类型解析基本元素,如果 type = 'testtype' 则存储它的 id

给出以下输入:

XML

<INTERNAL_MATCH>&lt;product ownerProducer="USA"&gt;&lt;name&gt;Test Product&lt;/name&gt;&lt;shortName&gt;TP&lt;/shortName&gt;&lt;base type="testtype" id="1235"/&gt;&lt;base type="testtype2" id="1236"/&gt;&lt;/product&gt;</INTERNAL_MATCH>

这个样式表:

XSLT 3.0

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

<xsl:template match="INTERNAL_MATCH">
    <xsl:variable name="unescapedXML" select="parse-xml(.)"/>
    <TESTVAL>
        <output-params2>
            <xsl:value-of select="$unescapedXML/product/base[@type='testtype']/@id" />
         </output-params2>
      </TESTVAL> 
   </xsl:template>

</xsl:stylesheet>

将返回:

结果

<?xml version="1.0" encoding="UTF-8"?>
<TESTVAL>
   <output-params2>1235</output-params2>
</TESTVAL>

重要:

我已从您的输入示例中删除了未声明的命名空间前缀

ism:
。我假设在您的实际情况下,此前缀已正确声明并绑定到名称空间,否则您会收到错误而不是报告的结果。

© www.soinside.com 2019 - 2024. All rights reserved.