我找不到以下不起作用的原因。
如果我的文档看起来像
<mydocroot>
<request>
<key>Ham</key>
</request>
<node>
<data alias='Ham' id='27'>Some value</data>
<data alias='Eggs' id='14'>Greenish</data>
<data alias='Condiment' id='32'>Salt and pepper</data>
...
</node>
</mydocroot>
和一个看起来像
的xsl模板<xsl:template match="/">
<xsl:value-of select="/mydocroot/node/data[@alias=string(/mydocroot/request/key)]" />
</xsl:template>
什么都不打印。
<xsl:template match="/">
<xsl:value-of select="/mydocroot/node/data[@alias='Ham']" />
</xsl:template>
按预期打印“某些值”。
我做错了什么?
谢谢!
编辑:
我实际上并不是100%肯定我正在使用的基础文档是什么样的,但我知道,继续这个例子,
<xsl:value-of select="/mydocroot/request/key" /> <!-- prints "Ham" -->
作品。
我是否可以将属性值与节点值匹配?
答案 0 :(得分:0)
如果使用“/”启动XPath表达式,则表示您从文档的根节点开始,但根元素是“mydocroot”,因此您需要将其包含在XPath中。
<xsl:value-of select="/mydocroot/node/data[@alias=string(/mydocroot/request/key)]" />
答案 1 :(得分:0)
所以我得到了以下工作,但似乎是hackish:
<xsl:template match="/">
<xsl:variable name="aliasval"><xsl:value-of select="string(/mydocroot/request/key)" /></xslvariable>
<xsl:value-of select="/myrootdoc/node/data[@alias=$aliasval]" />
</xsl:template>
我是否需要为此创建变量?我可能在这里碰到了我对XSLT的了解。
答案 2 :(得分:0)
“我应该能够将属性值与节点值匹配吗?”
肯定是的。属性值是一个字符串,当与字符串进行比较时,XSLT会自动将另一个操作数强制转换为字符串。无需明确调用string()
。这对我有用(它也适用于你):
<xsl:value-of select="/mydocroot/node/data[@alias = /mydocroot/request/key]" />
<!-- prints "Some value" -->
更好,因为更明确(/mydocroot/request/key
可以选择多个节点!):
<xsl:value-of select="/mydocroot/node/data[@alias = /mydocroot/request/key[1]]" />
在这些讨论中,<xsl:key>
也会派上用场:
<xsl:key name="kDataByAlias" match="node/data" use="@alias" />
<!-- later... -->
<xsl:value-of select="key('kDataByAlias', /mydocroot/request/key[1])" />