2009-10-07 31 views
0

我找不到以下原因无法解决的原因。XSL动态架构

如果我有一个文件,看起来像

<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:template match="/"> 
    <xsl:value-of select="/mydocroot/node/data[@alias=string(/mydocroot/request/key)]" /> 
</xsl:template> 

打印任何内容的XSL模板。

<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

你确定你的根元素叫做“xml”? – 2009-10-07 20:26:49

+0

您的第一个模板适用于使用xmlstarlet/libxslt,您使用的是哪种xsl处理器? – 2009-10-07 22:45:26

回答

0

如果使用“/”启动XPath表达式,则表示您从文档的根节点开始,但根元素为“mydocroot”,因此您需要将其包含在XPath中。

<xsl:value-of select="/mydocroot/node/data[@alias=string(/mydocroot/request/key)]" /> 
+0

他不需要在“节点”之前包含/ xml吗?那不应该让他的第二个模板失败? – 2009-10-07 20:28:55

+0

@Martin谢谢,我的坏,我没有注意到,请求者也改变了领先选择器,纠正它。 – Thiyagaraj 2009-10-07 20:37:35

+0

哎呀,请求者更改了问题中的信息,再次更新 – Thiyagaraj 2009-10-07 20:41:37

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的知识。

+0

看看我的其他解决方案,为什么不在选择器中放入XPath,而是将其放入变量中,然后使用它。 – Thiyagaraj 2009-10-07 20:42:26

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

在这些siutations,一<xsl:key>也会派上用场:

<xsl:key name="kDataByAlias" match="node/data" use="@alias" /> 

<!-- later... --> 

<xsl:value-of select="key('kDataByAlias', /mydocroot/request/key[1])" />