我和我有以下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”。任何帮助表示赞赏
答案 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
。
请注意:
根据定义,当且仅当节点集$ns
非空时,函数boolean
($ ns)才返回true。
布尔值true()
的字符串表示形式为字符串"true"
。
<强>更新强>:
在评论中,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>