在xsl:param xsl中引用属性值:if test condition

时间:2012-06-19 03:27:58

标签: xslt testing if-statement attributes param

我正在尝试从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

2 个答案:

答案 0 :(得分:3)

您遇到问题

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

这定义了一个名为xsl:param的{​​{1}},其值是当前节点('/')的名为test的子元素。由于top元素是Jane而不是<product><Jane>参数的值为空节点集(以及字符串值 - 空字符串)。

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

test

整个处理任务可以很容易地实施

此XSLT 1.0转换

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

应用于提供的XML文档

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

生成想要的正确结果

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

<强>解释

XSLT 1.0语法禁止匹配模式中的变量/参数引用。这就是为什么我们有一个匹配任何<h2>The Maze </h2> <p> Jane Evans</p> 的模板,我们在模板中指定了以特定的,想要的方式处理的条件。

XSLT 2.0解决方案

title

当在提供的XML文档(上面)上应用此转换时,再次生成相同的想要的正确结果

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

<强>解释

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

答案 1 :(得分: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>