2

我正在尝试从 xsl:param 检索属性值并在 xsl:if 测试条件中使用它。所以给定以下xml

<product>
  <title>The Maze / Jane Evans</title> 
</product>

和 xsl

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

<xsl:param name="test" select="Jane"/>

 <xsl:template match="title[contains(., (REFERENCE THE SELECT ATTRIBUTE IN PARAM))]">
   <h2>
    <xsl:value-of select="substring-before(., '/')"/>
   </h2>
   <p>
    <xsl:value-of select="substring-after(., '/')"/>
   </p>
 </xsl:template>

 <xsl:template match="title">
   <h2><xsl:value-of select="."/></h2>
 </xsl:template>
</xsl:stylesheet>

我想回来

The Maze

Jane Evans
4

2 回答 2

3

你在这一行有问题

<xsl:param name="test" select="Jane"/>

这定义了一个xsl:paramnamed test,其值是当前节点 ('/') 的子元素 named Jane。由于顶部元素 is<product>和 not <Jane>test参数具有空节点集的值(和字符串值 - 空字符串)。

你想要(注意周围的撇号):

<xsl:param name="test" select="'Jane'"/>

整个处理任务可以相当容易地实现

这个 XSLT 1.0 转换

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pTest" select="'Jane'"/>

 <xsl:template match="title">
  <xsl:choose>
    <xsl:when test="contains(., $pTest)">
       <h2>
        <xsl:value-of select="substring-before(., '/')"/>
       </h2>
       <p>
        <xsl:value-of select="substring-after(., '/')"/>
       </p>
    </xsl:when>
    <xsl:otherwise>
      <h2><xsl:value-of select="."/></h2>
    </xsl:otherwise>
  </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时

<product>
    <title>The Maze / Jane Evans</title>
</product>

产生想要的正确结果

<h2>The Maze </h2>
<p> Jane Evans</p>

说明

XSLT 1.0 语法禁止在匹配模式中引用变量/参数。这就是为什么我们有一个匹配任何模板的单一模板title,并且我们在模板中指定了以特定的、想要的方式进行处理的条件。

XSLT 2.0 解决方案

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pTest" select="'Jane'"/>

 <xsl:template match="title[contains(., $pTest)]">
   <h2>
     <xsl:value-of select="substring-before(., '/')"/>
   </h2>
   <p>
     <xsl:value-of select="substring-after(., '/')"/>
   </p>
 </xsl:template>

 <xsl:template match="title">
   <h2><xsl:value-of select="."/></h2>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档(上图)时,同样会产生相同的正确结果

<h2>The Maze </h2>
<p> Jane Evans</p>

说明

XSLT 2.0 没有 XSLT 1.0 的限制,并且可以在匹配模式中使用变量/参数引用。

于 2012-06-19T04:05:25.813 回答
1

术语 $test 指的是测试参数的值。使用 $test

例如:

 <xsl:template match="title[contains(., $test)]">
   <h2>
    <xsl:value-of select="substring-before(., '/')"/>
   </h2>
   <p>
    <xsl:value-of select="substring-after(., '/')"/>
   </p>
 </xsl:template>
于 2012-06-19T03:40:28.303 回答