XSL动态模式

时间:2009-10-07 20:20:50

标签: xslt

我找不到以下不起作用的原因。

如果我的文档看起来像

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

作品。

我是否可以将属性值与节点值匹配?

3 个答案:

答案 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])" />