【问题标题】:XSL Transformation and XPathXSL 转换和 XPath
【发布时间】:2012-04-17 10:50:08
【问题描述】:

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

【问题讨论】:

    标签: xslt xpath


    【解决方案1】:

    这里有两个问题

    1. word/[@id = Hurrengo_Hitza] 在语法上是无效的 XPath —— 谓词显示在定位步骤中的节点测试之后。

    2. &lt;xsl:template match="word/[@id = Hurrengo_Hitza]"&gt;。即使更正为 &lt;xsl:template match="word[@id = Hurrengo_Hitza]"&gt;(现在是语法上有效的 XPath 表达式和匹配模式),此模板也不匹配任何节点——它匹配任何 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>
    

    【讨论】:

      【解决方案2】:

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

      那就试试吧:

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

      更新:

      我认为您只能在 XSLT 2 的 match 属性上使用 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>
      

      【讨论】:

      • 在 match 属性上有一个变量似乎是个问题。我收到 XPath 错误:未定义的变量
      • 看看编辑后的答案,应该是word[@id]而不是word/[@id]
      【解决方案3】:

      改变

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

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

      【讨论】:

      • 如下所述,我已经纠正了这个错误,但仍然没有结果。想法?
      猜你喜欢
      • 1970-01-01
      • 2012-05-24
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 2012-11-19
      相关资源
      最近更新 更多