2012-04-17 84 views
1

我開發的應用程序是我需要改變看起來像這樣的XML文檔:XSL轉換和XPath

<?xml version='1.0' encoding='ISO-8859-1'?> 
<!DOCTYPE words SYSTEM "words.dtd"> 
<words> 
<word id="word_1">Alfa</word> 
<word id="word_2">Beta</word> 
<word id="word_3">Gamma</word> 
<word id="word_4">Delta</word> 
<word id="word_5">Zeta</word> 
</words> 

使用XSLT樣式表。我想轉換的結果是(在這種情況下)Delta這是我使用的XSL:

<?xml version='1.0' encoding='ISO-8859-1'?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:param name="Hurrengo_Hitza">word_4</xsl:param> 
    <xsl:template match="word/[@id = Hurrengo_Hitza]"> 
    <html> 
    <body> 
    <tr> 
     <td><xsl:value-of select="text()"/></td> 
    </tr> 
    </body> 
    </html> 
</xsl:template> 

</xsl:stylesheet> 

,也沒有任何結果,我有什麼在XSLT改變? XPath表達式有問題嗎?

回答

1

需要由DOLAR符號($)

前面的XSLT帕拉姆所以嘗試:

<xsl:template match="word[@id = $Hurrengo_Hitza]"> 

UPDATE:

我想你只能variables上在XSLT 2上匹配屬性。

但是,您可以這樣做:

<xsl:param name="Hurrengo_Hitza" select="'word_4'" /> 

<xsl:template match="/"> 
     <xsl:for-each select="//word[@id = $Hurrengo_Hitza]"> 
      <html> 
      <body> 
      <tr> 
       <td><xsl:value-of select="text()"/></td> 
      </tr> 
      </body> 
      </html> 
     </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 
+0

好吧,我糾正,但仍顯示沒有結果。任何想法? – Haritz 2012-04-17 10:58:00

+0

它在匹配屬性上有一個變量似乎是一個問題。我得到的XPath錯誤:未定義的變量 – Filype 2012-04-17 11:07:04

+0

看看編輯的答案,應該是字[@id]而不是字/ [@ ID] – Filype 2012-04-17 11:07:46

0

變化

<xsl:template match="word/[@id = Hurrengo_Hitza]"> 

<xsl:template match="word/[@id = $Hurrengo_Hitza]"> 
+0

如前所述下面我已經修正了這個錯誤,但還是沒有結果。想法? – Haritz 2012-04-17 11:00:16

3

有兩個問題在這裏

  1. word/[@id = Hurrengo_Hitza]語法上無效XPath - 謂詞showld在位置步驟中遵循節點測試。

  2. <xsl:template match="word/[@id = Hurrengo_Hitza]">。即使更正爲現在語法上有效的XPath表達式和匹配模式的<xsl:template match="word[@id = Hurrengo_Hitza]">,該模板也不匹配任何節點 - 匹配其任何word字符串值的id屬性等於其Hurrengo_Hitza元素之一的字符串值。但是,在提供的XML文檔中沒有word元素具有名爲Hurrengo_Hitza的子元素 - 因此該模板與任何節點都不匹配,並且根本不會執行。

解決方案

你想要的是像一個比賽模式:word[@id = $Hurrengo_Hitza] - 一個變量或參數引用必須與$字符開頭。

如果更改

<xsl:template match="word/[@id = Hurrengo_Hitza]"> 

<xsl:template match="word[@id = $Hurrengo_Hitza]"> 

你就會有一個工作XSLT 2.0解決方案。

然而,在XSLT 1.0(你似乎是使用),它是非法具有匹配圖案內的變量或參數的參考。

的XSLT解決方案,因此將是這樣的:

<xsl:template match="word"> 
    <xsl:if test="@id = $Hurrengo_Hitza"> 
    <!-- Processing here --> 
    </xsl:if> 
</xsl:template>