2009-10-07 36 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])" />