2012-04-17 88 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>