我需要在 XSLT 中使用某种字典,以便在给定一个键时我可以取回一个值。我知道有更正式的方法可以做到这一点,但它们与我的问题无关。
当给出以下 XML 时:
<Root>
<Entry>
<Number>123456</Number>
<Key>1</Key>
</Entry>
</Root>
并应用以下变换:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"
byte-order-mark="yes"
omit-xml-declaration="yes"/>
<xsl:variable name="myDictionary"
as="element()">
<dictionary>
<entry key="1">A</entry>
<entry key="2">B</entry>
<entry key="3">C</entry>
<entry key="4">D</entry>
<entry key="5">E</entry>
<entry key="6">F</entry>
<entry key="7">G</entry>
<entry key="8">H</entry>
<entry key="9">I</entry>
<entry key="10">J</entry>
<entry key="11">K</entry>
<entry key="12">L</entry>
<entry key="13">M</entry>
<entry key="14">N</entry>
<entry key="15">O</entry>
</dictionary>
</xsl:variable>
<xsl:template match="/">
<xsl:apply-templates select="Root/Entry"/>
</xsl:template>
<xsl:template match="Entry">
<!-- Employee Identifier -->
<xsl:value-of select="Number"/>
<xsl:text> : </xsl:text>
<xsl:value-of select="Key"/>
<xsl:text> : </xsl:text>
<xsl:value-of select="$myDictionary/entry[@key=Key]"/>
<xsl:text> : </xsl:text>
<xsl:value-of select="$myDictionary/entry[@key='1']"/>
</xsl:template>
</xsl:stylesheet>
我期望得到以下输出:
123456 : 1 : A : A
我实际上得到的是令人困惑的:
123456 : 1 : : A
在实际输出中,我可以看到它<xsl:value-of select="Key"/>
包含我期望的值:1
最后一个的value-of
行为也符合我的预期:当从元素中选择entry
具有匹配属性的元素时1
,我得到了我期望的值:A
。
那么为什么我在第三个语句中没有得到任何值呢value-of
?由于Key
contains1
和contains1
相匹配,我应该得到......是吗?entry
A
A
有什么建议为什么这不能按我预期的方式工作吗?顺便说一句,我正在使用 XSLT 2.0。
(顺便说一句,我也在研究如何正确使用XSLT中的key()函数,这可能会解决问题,但我也想知道上述难题的答案)。
这个说法:
将比较(xpath :) 中不存在
Key
的元素。entry
entry/Key
只需将其更改为:
它将使用模板上下文。
或者另一种选择是,首先将该 Key 存储在变量中并像这样使用它:
为了完成,您可以使用这样的密钥: