1

我正在开发一个应用程序,我需要转换如下所示的 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 表达式有问题吗?

4

3 回答 3

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元素之一的字符串值的任何字符串值。但是word,所提供的 XML 文档中的任何元素都没有名为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>
于 2012-04-17T13:07:55.907 回答
1

XSLT 中的参数前面需要一个圆号 ($)

所以试试:

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

更新:

我认为您只能使用variablesXSLT 2 上的 match 属性。

但你可以这样做:

<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>
于 2012-04-17T10:54:46.340 回答
0

改变

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

<xsl:template match="word/[@id = $Hurrengo_Hitza]">
于 2012-04-17T10:57:25.193 回答