我有一个关于xsl:for-each loop的问题:
我有类似的东西
<hodeName>
<nodeChild name='name1'>value</nodeChild>
<nodeChild name='name2'>value</nodeChild>
<nodeChild name='name3'/>
</hodeName>
我想遍历它们,用属性名称命名一个变量并为其分配值。我正在为类似的事情而苦苦挣扎
<xsl:for-each select="/root/nodeName">
<json:string name="{current()/@name}"><xsl:value-of select="current()" /></json:string>
</xsl:for-each>
这行不通。但是,它正在分配正确的xsl:value-of。
选择的是/root/nodeName
而不是XML建议的/hodeName/nodeChild
。否则它似乎有效。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:json="http://json.org/"
version="1.0">
<xsl:template match="/">
<json:object>
<xsl:for-each select="/hodeName/nodeChild">
<json:string name="{current()/@name}"><xsl:value-of select="current()" /></json:string>
</xsl:for-each>
</json:object>
</xsl:template>
</xsl:stylesheet>
此外,除非它是唯一的表达式,否则无需指定current()
。 @name
相当于current()/@name
。
为什么你的方法不起作用
您正在定义要由如下for-each
处理的序列:
<xsl:for-each select="/root/nodeName">
但是,如果将其与输入 XML 进行比较,则不会发现最外层的元素称为 root
。最外面的元素称为 hodeName
。也许您认为 XSLT 中/root
引用文档根目录的特殊关键字?事实并非如此。 root
只是一个普通的 XML 元素。 /
本身位于 XPath 表达式的开头时,表示根节点或文档节点。
另一种方法是使用多个模板而不是for-each
。"循环"是一个与过程语言更相关的概念,而不是像 XSLT 这样的声明性函数式语言。应用模板是XSLT-onic(也许你知道Python?)的方式。
您确定最外层的元素应该称为hodeName
而不是nodeName
吗?
样式表
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:json="http://json.org/">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="hodeName">
<json:object>
<xsl:apply-templates/>
</json:object>
</xsl:template>
<xsl:template match="nodeChild">
<json:string name="@name">
<xsl:value-of select="."/>
</json:string>
</xsl:template>
</xsl:stylesheet>
XML 输出
<?xml version="1.0" encoding="utf-8"?>
<json:object xmlns:json="http://json.org/">
<json:string name="@name">value</json:string>
<json:string name="@name">value</json:string>
<json:string name="@name"/>
</json:object>