使用 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" />
但它什么也没返回。
按类型解析基本元素,如果 type = 'testtype' 则存储它的 id
给出以下输入:
XML
<INTERNAL_MATCH><product ownerProducer="USA"><name>Test Product</name><shortName>TP</shortName><base type="testtype" id="1235"/><base type="testtype2" id="1236"/></product></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:
。我假设在您的实际情况下,此前缀已正确声明并绑定到名称空间,否则您会收到错误而不是报告的结果。