我正在尝试获取外部文档的节点值,但我无法获得任何有用的内容。
这是products.xml
<TESTS>
<CHILD>
<KEY>111111</KEY>
<PRODUCT>Toy 1</PRODUCT>
</CHILD>
<CHILD>
<KEY>222222</KEY>
<PRODUCT>Toy 2</PRODUCT>
</CHILD>
</TESTS>
这是正在转换的文件companys.xml
<INVENTORY>
<PRODUCTS>
<ITEMS>
<ITEM TYPE="Toys">111111</ITEM>
</ITEMS>
</PRODUCTS>
<PRODUCTS>
<ITEMS>
<ITEM TYPE="Toys">222222</ITEM>
</ITEMS>
</PRODUCTS>
<INVENTORY>
这是我的xsl代码
<xsl:variable name="lookupDoc" select="document('products.xml')" />
<xsl:key name="product-lookup" match="KEY" use="."/>
<xsl:template match="PRODUCT_HTML">
<xsl:value-of select="./@TYPE"/> <xsl:value-of select="."/> <xsl:value-of select="$lookupDoc/exam-lookup" />
</xsl:template>
我从中得到的是
Toys 111111
我想得到的是
Toys 111111 Toy 1
你能帮帮我吗?
谢谢,
亚历
答案 0 :(得分:1)
xsl:key
元素必须与key()
函数一起使用。
您的关键定义
<xsl:key name="product-lookup" match="KEY" use="."/>
我想,不是你想要的。 match
控制要返回的元素,而use
告诉查找中匹配的表达式。如上所述,它将返回KEY
元素本身,并且要转到PRODUCT
,您必须横向遍历。它应该是
<xsl:key name="product-lookup" match="CHILD" use="KEY"/>
这样,表达式如
<xsl:value-of select="key('product-lookup', '111111') />
将指向CHILD
文件中的第一个products.xml
节点。然后,您可以向下遍历产品名称。
但是,在外部文档上使用key()
函数时,XSLT 1.0中出现了问题:key()
对&#34;上下文文档&#进行操作34;,所以如果当前节点在输入文档companys.xml
中,查找将不会给出您想要的结果。
要解决此问题,您可以将上下文设置为目标文档,如下所示:
<xsl:variable name="key" select="." />
<xsl:variable name="child">
<xsl:for-each select="$lookupDoc">
<xsl:value-of select="key('product-lookup', $key)/PRODUCT"/>
</xsl:for-each>
</xsl:variable>
现在$child
现在包含相应PRODUCT
下的CHILD
元素的字符串值。 (参见注释re variable binding。)
请注意,存储密钥需要一个额外的变量,以便在更改上下文时.
不会改变其含义。换句话说,您必须首先将绑定保存到原始文档中的键值。
在XSLT 2.0中,您可以通过使用添加到key()
函数的第三个参数来设置上下文文档来避免其中的一些:
<xsl:variable name="child" select="key('product-lookup', ., $lookupDoc)" />
使这个(常见)问题变得更加清晰。