为什么这个属性选择没有返回值?

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

我需要在 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
包含
1
并且
1
与包含
entry
A
匹配,我应该得到
A
...是吗?

有什么建议说明为什么这没有按我预期的方式工作吗?顺便说一句,我正在使用 XSLT 2.0。

(顺便说一句,我也在研究如何正确使用XSLT中的key()函数,这可能会解决问题,但我也想知道上述难题的答案)。

xslt-2.0
1个回答
0
投票

本声明:

<xsl:value-of select="$myDictionary/entry[@key=Key]"/>

将比较

Key
(xpath:
entry
)中不存在的元素
entry/Key

只需将其更改为:

<xsl:value-of select="$myDictionary/entry[@key=current()/Key]"/>

它将使用模板上下文。

或者另一种选择是,首先将该 Key 存储在变量中并像这样使用它:

<xsl:template match="Entry">
  <!-- Employee Identifier -->
  <xsl:value-of select="Number"/>
  <xsl:text> : </xsl:text>
  <xsl:value-of select="Key"/>
  <xsl:text> : </xsl:text>
  <!-- Key value of Entry -->
  <xsl:variable name="key" select="Key"/>
  <xsl:value-of select="$myDictionary/entry[@key= $key]"/>
  <xsl:text> : </xsl:text>
  <xsl:value-of select="$myDictionary/entry[@key='1']"/>
</xsl:template>
© www.soinside.com 2019 - 2024. All rights reserved.