在xslt中分配变量

时间:2012-06-18 11:47:05

标签: xslt

我和我有以下xsl

<Root>
    <child>
       <Book name="Title" value="hailey" />
       <Book name="Title" value="After death" />
       <Book name="Price" value="100" />
    </child>
    <child>
       <Book name="Title" value="After death" />
       <Book name="genre" value="fiction" />
    </child>
</Root>

我想迭代“子”节点,如果出现“Title”(至少一次),我想要设置一个变量。我在xslt

中使用以下代码
<xsl:variable name="flag">
        <xsl:for-each select="/Root/Child" >
            <xsl:for-each select="./Book" >
                   <xsl:if test="./@name = 'Title'">
                    <xsl:value-of select="'true'"/>                     
                </xsl:if>
            </xsl:for-each>
        </xsl:for-each>


</xsl:variable>

如果变量“flag”设置为“truetruetrue”,问题是我的值,而我希望它只是“true”。任何帮助表示赞赏

4 个答案:

答案 0 :(得分:7)

根本不需要迭代或条件指令。只需使用这个单行

<xsl:variable name="vYourName" select="boolean(/Root/Child/Book[@name='Title'])"/>

对于这个特定的XML文档,这可以表达得更短

<xsl:variable name="vYourName" select="boolean(/*/*/*[@name='Title'])"/>

<强>解释

当至少有一个"vYourName"元素具有true()属性时,两个定义都将名为Root/Child/Book的变量定义为Title

请注意

  1. 根据定义,当且仅当节点集$ns非空时,函数boolean($ ns)才返回true。

  2. 布尔值true()的字符串表示形式为字符串"true"

  3. <强>更新

    在评论中,OP问道:

      

    如果至少有一次出现,有没有办法分配   对变量的“价值”是什么?

    答案:是的,如果用“值”表示第一个 value属性,请使用:

     <xsl:variable name="vYourName" select="(/*/*/*[@name='Title'])[1]/@value"/>
    

答案 1 :(得分:0)

未经测试(以及更新感谢Lucero的评论)......

<xsl:variable name="flag">
  <xsl:if test="count(/Root/Child/Book[@name='Title'])>0">true</xsl:if>
</xsl:variable>

答案 2 :(得分:0)

<xsl:variable name="flag">
   <xsl:if test="/Root/Child/Book/@name = 'Title'">
      <xsl:value-of select="'true'"/>                     
   </xsl:if>
</xsl:variable>

答案 3 :(得分:0)

如果您愿意坚持使用代码,可以使用

<xsl:variable name="flag">
    <xsl:for-each select="//Book" >
        <xsl:if test="@name = 'Title'">
            <xsl:value-of select="'true'"/>
        </xsl:if>
    </xsl:for-each>
</xsl:variable>