xsl:for-each 获取 current() 节点属性



我有一个关于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>

相关内容

  • 没有找到相关文章

最新更新