【问题标题】:Select value from root node in XSLT从 XSLT 中的根节点中选择值
【发布时间】:2013-02-04 02:30:26
【问题描述】:

我有一个 XSL 变量 prdxml,它包含这样的 XML

    <node id="2939" parentID="2938" level="3" writerID="0" >
  <data alias="itemNumbers">,3101056,8261247,</data>
  <data alias="pass_word">akspass</data>
  <data alias="logo">/media/41532/inner-logo01.png</data> 
</node>

如何从这个变量中选择根节点中的 id(id="2939")

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    这看起来像 Umbraco 节点的 XML 结构(v4.5 之前)。

    要访问 Umbraco 节点上的任何属性,您可以使用 @ 符号,如下所示:

    <xsl:value-of select="$prdxml/@id" />
    <xsl:value-of select="$prdxml/@parentID" />
    

    要访问您在 Umbraco 节点上定义的属性,您将使用如下内容:

    <xsl:value-of select="$prdxml/data[@alias='pass_word']" />    
    <xsl:value-of select="$prdxml/data[@alias='logo']" />
    

    Umbraco 在他们的 wiki 上有一个完整的部分; http://our.umbraco.org/wiki/reference/xslt ;带有如何使用 XPATH 遍历其 XML 的示例。



    -- 编辑地址 cmets--

    我的 XSLT 的工作版本是:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#x00A0;"> ]>
    <xsl:stylesheet 
        version="1.0" 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
        xmlns:msxml="urn:schemas-microsoft-com:xslt"
        xmlns:umbraco.library="urn:umbraco.library" xmlns:Exslt.ExsltCommon="urn:Exslt.ExsltCommon" xmlns:Exslt.ExsltDatesAndTimes="urn:Exslt.ExsltDatesAndTimes" xmlns:Exslt.ExsltMath="urn:Exslt.ExsltMath" xmlns:Exslt.ExsltRegularExpressions="urn:Exslt.ExsltRegularExpressions" xmlns:Exslt.ExsltStrings="urn:Exslt.ExsltStrings" xmlns:Exslt.ExsltSets="urn:Exslt.ExsltSets" 
        exclude-result-prefixes="msxml umbraco.library Exslt.ExsltCommon Exslt.ExsltDatesAndTimes Exslt.ExsltMath Exslt.ExsltRegularExpressions Exslt.ExsltStrings Exslt.ExsltSets">
    
    <xsl:output method="html" omit-xml-declaration="yes"/>
    
    <xsl:param name="currentPage"/>
    
    <xsl:template match="/">
        Current Page ID : <xsl:value-of select="$currentPage/@id" />
    </xsl:template>
    
    </xsl:stylesheet>
    

    这可能不会显示在您的页面上的可能原因是:

    • &lt;xsl:param name="currentPage" /&gt; 已从 XSLT 中删除。
    • XSLT 未绑定到宏。
    • 模板中未包含宏。
    • 模板未分配给您的节点。
    • 节点尚未发布。

    【讨论】:

    • 你对 umbraco 的看法是对的。但是代码对我不起作用。有什么想法吗?
    • 如何获取源 XML?我们可以看到$prdxml 声明吗?
    • 其实它在umbraco中的currentpage元素。我这里只是把它称为prdxml给那些不熟悉umbraco的人
    • 啊,以为可能是这样,但不想将问题与假设混淆。 $currentPage/@id 应该可以解决问题。
    • 这是一段非常标准的 Umbraco XSLT 代码,我刚刚测试过,它工作正常(请参阅我修改后的答案)。我怀疑有其他东西阻止它显示。 XSLT 中的任何文本最终会显示在 HTML 页面上吗?
    【解决方案2】:

    我猜你正在使用 XSLT 1.0。

    要执行类似的操作,您必须依赖扩展函数 node-set()。但由于是扩展功能,它的可用性取决于您使用的 XSLT 处理器。

    例如,在 xsltproc、saxon 中,您可以使用类似:

    <xsl:stylesheet xmlns:exsl="http://exslt.org/common"
                    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    version="1.0">
    
        <xsl:variable name="_prdxml">
            <node id="2939" parentID="2938" level="3" writerID="0" >
                <data alias="itemNumbers">,3101056,8261247,</data>
                <data alias="pass_word">akspass</data>
                <data alias="logo">/media/41532/inner-logo01.png</data> 
            </node>
        </xsl:variable>
    
        <xsl:template match="/">
            <xsl:variable name="prdxml" select="exsl:node-set($_prdxml)" />
            <!-- Now you can navigate through the prdxml node set -->
            <xsl:apply-templates select="$prdxml/node[@id = '2939']" />
        </xsl:template>
    
    </xsl:stylesheet>
    

    如果您使用的是 Microsoft XSLT 处理器,则必须将扩展函数的命名空间更改为

    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多