XSL 1.0如何从外部文档中获取

时间:2014-05-13 18:13:26

标签: xml xslt

我正在尝试获取外部文档的节点值,但我无法获得任何有用的内容。

这是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

你能帮帮我吗?

谢谢,

亚历

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)" />

使这个(常见)问题变得更加清晰。