除了使用扩展之外,如何在 XSLT 中处理自定义命名空间? [复制]

Posted

技术标签:

【中文标题】除了使用扩展之外,如何在 XSLT 中处理自定义命名空间? [复制]【英文标题】:How to handle custom Namespaces in XSLT other than using extensions? [duplicate] 【发布时间】:2021-02-05 05:18:25 【问题描述】:

我有以下 xsml 文件

<?xml version="1.0" encoding="UTF-8"?>
<gas-xml xmlns="http://gas-xml.de/3.2/gas-xml">
    <body>              
        <data> 
            <voplist object-id="someID" period="hour" values-per-period="1" >
                <vopset quantity="Vbus">
                    <vop i="0" state="">0</vop>
                    <vop i="1" state="">0</vop>
                    <vop i="2" state="">0</vop>
                </vopset>
            </voplist>
        </data>
    </body>
</gas-xml>

我尝试使用以下代码将其转换为另一个 xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <body>
            <timeseries dateformat="yyyy-MM-dd'T'HH:mm:ssZ" freq="Hourly" valuealign="left">
                <xsl:for-each select="/body/data/voplist/vopset/vop">
                    <value>
                        <xsl:attribute name="time">
                            <xsl:value-of select="@i"/>
                        </xsl:attribute>
                    </value>
                </xsl:for-each>
            </timeseries>
        </body>
    </xsl:template>
</xsl:stylesheet>

但不知何故,命名空间 &lt;gas-xml xmlns="http://gas-xml.de/3.2/gas-xml"&gt; 不允许 for-each 读取 xml 文件,因为当我从命名空间中删除部分 xmlns="http://gas-xml.de/3.2/gas-xml 时,它工作正常。我已经使用了带有扩展的方法,但我正在使用的系统不允许扩展。所以我正在寻找另一种解决方案,而不是使用扩展。

【问题讨论】:

【参考方案1】:

在 xslt 中使用如下命名空间 (xmlns="http://gas-xml.de/3.2/gas-xml")

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:a="http://gas-xml.de/3.2/gas-xml"
    exclude-result-prefixes="a"
    version="1.0">
    <xsl:template match="/">
        <body>
            <timeseries dateformat="yyyy-MM-dd'T'HH:mm:ssZ" freq="Hourly" valuealign="left">
                <xsl:for-each select="//a:body/a:data/a:voplist/a:vopset/a:vop">
                    <value>
                        <xsl:attribute name="time">
                            <xsl:value-of select="@i"/>
                        </xsl:attribute>
                    </value>
                </xsl:for-each>
            </timeseries>
        </body>
    </xsl:template>
</xsl:stylesheet>

请参阅 https://xsltfiddle.liberty-development.net/jxNakA4 的转换

【讨论】:

很好,它有效。您能否解释一下 :a 的作用?你给它一个前缀,然后用 exclude-result-prefix 删除它? 如果源 xml 中的命名空间中没有标识符而不是 xslt 它需要使用虚拟标识符调用,如果您不为该命名空间传递虚拟标识符,则无法检索 xml元素。

以上是关于除了使用扩展之外,如何在 XSLT 中处理自定义命名空间? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用自定义XSLT在浏览器中显示Atom / RSS源?

除了 80 / 443 之外,我可以为 Kubernetes 入口设置自定义端口以侦听吗?

两阶段处理:不要从阶段 1 XSLT 2.0 处理中输出空标签

xslt正则表达式

当节点命名为 <foo:bar> 时,如何在 XSLT 中选择节点?

Flowable入门系列文章83 - 验证图表并导出为自定义输出格式