XSL转换和XPath

时间:2012-04-17 10:50:08

标签: xslt xpath

我正在开发一个应用程序,我需要转换如下所示的XML文档:

<?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表达式出了什么问题?

3 个答案:

答案 0 :(得分:3)

这里有两个问题

  1. word/[@id = Hurrengo_Hitza]语法无效XPath - 谓词showld遵循位置步骤中的节点测试。

  2. <xsl:template match="word/[@id = Hurrengo_Hitza]">。即使更正为<xsl:template match="word[@id = Hurrengo_Hitza]">现在语法上有效的XPath表达式和匹配模式,此模板也不匹配任何节点 - 它匹配任何wordid属性的字符串值等于其Hurrengo_Hitza元素之一的字符串值。但是,提供的XML文档中没有word元素具有名为Hurrengo_Hitza的子元素 - 因此模板与任何节点都不匹配,根本不会执行。

  3. <强>解决方案

    您想要的是匹配模式,例如: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>
    

答案 1 :(得分:1)

XSLT中的参数需要以dolar符号($)

开头

所以试试:

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

<强>更新

我认为在XSLT 2上的匹配属性上只允许variables

但是你可以这样做:

    

<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>

答案 2 :(得分:0)

更改

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

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