在xslt中分配变量

在xslt中分配变量,xslt,Xslt,我随身携带以下xsl <Root> <child> <Book name="Title" value="hailey" /> <Book name="Title" value="After death" /> <Book name="Price" value="100" /> </child> <child> <Book nam

我随身携带以下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>

我想遍历“child”节点,如果出现“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”被设置为“truetrue”,那么我需要的值就是“true”。感谢未经测试的任何帮助(感谢Lucero的评论)


真的

如果您想坚持使用您的代码,可以使用

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

根本不需要迭代或条件指令。只需使用这一行即可

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

正如我在答复中指出的那样,没有“头衔”attribute@freefaller:感谢您指出这一点--答案已相应修复。如果至少出现一次,是否有方法将其“值”指定给变量?@parameteswar:可能有许多值,其中哪一个?如果您总是想要第一个,请使用:
(/*/*/*[@name='Title'])[1]/@value
这只检查树的第一个层次结构。@参数为否,它会检查此路径的完整树-XPath是这样工作的。如果第一个层次结构中没有出现标题,变量值被设置为空道歉-这是我错误地阅读您的需求的方式(如果没有标题就什么都没有)。在这种情况下,我建议使用Dimitre(他有点像XSLT专家)提供的答案。很抱歉,这对我很有用。谢谢!
<xsl:variable name="vYourName" select="boolean(/Root/Child/Book[@name='Title'])"/>
<xsl:variable name="vYourName" select="boolean(/*/*/*[@name='Title'])"/>
 <xsl:variable name="vYourName" select="(/*/*/*[@name='Title'])[1]/@value"/>