【问题标题】:xsl:for-each Getting the current() node attributexsl:for-each 获取 current() 节点属性
【发布时间】:2015-01-09 15:22:08
【问题描述】:

我有一个关于 xsl:for-each 循环的问题:

我有类似的东西

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

【问题讨论】:

    标签: xml foreach xslt-1.0


    【解决方案1】:

    您正在选择 /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

    【讨论】:

    • 非常感谢您通过简单地添加 @name 来澄清 current() 和它的节点属性之间的这个引用。
    • 实际上我仍然无法进入动态分配变量名的循环: 循环遍历:12current() 给了我正确的值,但我无法在 JSON 中分配环变量名称,例如:{"n1": "1"....}
    • select="/document" 选择根元素,其中只有一个。改为使用 select="/document/config" 循环遍历 &lt;config&gt; 元素。 (并使用反引号 (`) 引用内联代码)
    • select="document/config" 绝对是正确的方法,但我仍然无法动态设置变量名:&lt;xsl:for-each select="/document/config"&gt; &lt;json:string name="@name"&gt;&lt;xsl:value-of select="current()" /&gt;&lt;/json:string&gt; &lt;/xsl:for-each&gt; where @name 我需要获取 name 属性的值并创建一个json 字符串,并将其赋值为current()
    【解决方案2】:

    为什么你的方法不起作用

    您正在定义一个由for-each 处理的序列,如下所示:

    <xsl:for-each select="/root/nodeName">
    

    但是,如果您将其与输入 XML 进行比较,则没有称为 root 的最外层元素。最外面的元素称为hodeName。或许您认为/root 是XSLT 中用于引用文档根目录的特殊关键字?事实并非如此。 root 只是一个普通的 XML 元素。 / 本身,当位于 XPath 表达式的开头时,表示 root文档节点


    另一种方法是使用多个模板而不是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>
    

    【讨论】:

    • 感谢您的详细解释。您可能通过添加更多声明性方法是正确的,因为这是 xsl。关于根元素 - 不,我只是替换了文档中的原始值以简化它。
    • @Vladyn 欢迎您。下次您提出问题时,请确保不要编辑相关信息(root 元素出现在您的代码中,但不在输入 XML 中)。并且一定要accept an answer(不一定是我的),也可以your last question
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    相关资源
    最近更新 更多