2015-02-23 50 views
0

選擇元素我有這個XML文件:如何通過屬性與XSLT

<writer id_writer="1"> 
    <name>name</name> 
</writer> 

<film id_writer="1"> 
</film> 

如何使用XSLT

<xsl:for-each select="film"> 
    <xsl:value-of select="writer[@id_writer='what to put here']/name"></xsl:value-of> 
</xsl:for-each> 

回答

6

解決的CRO的最有效方式在XSLT中像這樣的引用通常是使用密鑰。關鍵定義去在你的樣式表的頂層,外面的任何模板,並指定要檢索哪些節點和如何計算確定鍵值爲每一個

<xsl:key name="writerById" match="writer" use="@id_writer" /> 

一旦密鑰被定義,你可以檢索使用功能

<xsl:value-of select="key('writerById', @id_writer)/name"/> 

一些XSLT處理器(特別是最近撒克遜EE版本)的鍵值匹配的節點會自動優化//writer[@id_writer = current()/@id_writer]謂詞爲有效地執行作爲明確的基於密鑰的方法,但是這是不是你可以必須依靠,如果你使用的是較老或較不復雜的公關ocessor。

1

我認爲你正在嘗試涉及film打印每部電影的編劇和writer通過它們的屬性,那麼試試這個:

<xsl:for-each select="film"> 
    <xsl:value-of select="../writer[@id_writer=current()/@id_writer]/name"/> 
</xsl:for-each> 
+1

'../ writer'而不僅僅是'writer' - 他們是兄弟姐妹,而不是父母和孩子。 – 2015-02-23 12:12:35

+0

謝謝,@IanRoberts ..有點過於自信,我沒有測試它:) – 2015-02-23 12:16:07

1

的直接回答你「要放什麼東西在這裏」是

current()/@id_writer 

然而,這並不是使其工作,正如作家節點不是電影節點的樹的一部分,唯一需要的東西。根據您的問題,一個完整的工作答案:這裏

<?xml version="1.0" encoding="UTF-8"?> 
<body> 
    <writer id_writer="1"> 
     <name>name</name> 
    </writer> 

    <film id_writer="1"> 
    </film> 
</body> 

工作示例:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="text" encoding="iso-8859-1" omit-xml-declaration="yes" /> 

    <xsl:template match="/body"> 
     <xsl:for-each select="film"> 
      <xsl:value-of select="/body/writer[@id_writer=current()/@id_writer]/name"/> 
     </xsl:for-each> 
    </xsl:template> 

</xsl:transform> 

完整的XML養活這個http://xsltransform.net/bFDb2Ck

+0

請確保您的答案包含與您的工作示例相同的代碼。你的工作例子確實有效,你的代碼不會。 – 2015-02-23 13:05:23

+0

我試圖回答只是確切的問題,是'該放什麼東西'。但我現在編輯了我的答案來澄清。 – 2015-02-23 13:21:22

+1

這不是我的意思。在你編輯答案之前,在路徑表達式前面沒有'/ body /' - 並且它將無處可用。 – 2015-02-23 13:50:51