首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XMLStarlet + XInclude + XSLT

XMLStarlet + XInclude + XSLT
EN

Stack Overflow用户
提问于 2015-03-27 10:29:29
回答 1查看 1.5K关注 0票数 3

我希望将XML文档的内容包含到另一个XML文档中,并通过xmlstarlet+XSLT对其进行转换。我正在尝试使用XInclude。(我是XInclude和XSLT的新手。)不过,xmlstarlet不会处理包含的XML文档,它只是将包含节点保持不变。

文件a.xml

代码语言:javascript
复制
<?xml version="1.0" ?>
<doc xmlns:xi="http://www.w3.org/2001/XInclude">
a
<xi:include href="b.xml" />
b
</doc>

文件b.xml

代码语言:javascript
复制
<?xml version="1.0" ?>
<snippet>
c
</snippet>

x.xsl“通过”模板:

代码语言:javascript
复制
<?xml version="1.0" encoding="windows-1250" ?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" />

<xsl:template match="/">
<xsl:copy-of select="."/>
</xsl:template>

</xsl:transform>

要运行的命令行:

代码语言:javascript
复制
xmlstarlet tr x.xsl a.xml

预期产出将大致如下:

代码语言:javascript
复制
<?xml version="1.0" ?>
<doc xmlns:xi="http://www.w3.org/2001/XInclude">
a
<snippet>
c
</snippet>
b
</doc>

然而,我得到的结果是:

代码语言:javascript
复制
<?xml version="1.0"?>
<doc xmlns:xi="http://www.w3.org/2001/XInclude">
a
<xi:include href="b.xml"/>
b
</doc>

现在,我做错什么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-27 16:48:39

正如npostavs已经建议的那样,在默认情况下,xmlstarlet并不是XInclude文档,您需要显式地将其命名为--xinclude。然后,结果就是你所期望的结果:

代码语言:javascript
复制
$ xml tr --xinclude x.xsl a.xml
<?xml version="1.0"?>
<doc xmlns:xi="http://www.w3.org/2001/XInclude">
a
<snippet>
c
</snippet>
b
</doc>

除了xi:名称空间声明之外,您不能用XSLT1.0和简单的<xsl:copy-of select="."/>来消除这种声明。如果这是一个问题,样式表就会变得更复杂一些,因为XSLT1.0中没有copy-namespaces="no"

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" />

<xsl:template match="/">
<xsl:apply-templates select="." mode="copy-no-namespaces"/>
</xsl:template>

<xsl:template match="*" mode="copy-no-namespaces">
    <xsl:element name="{local-name()}" namespace="{namespace-uri()}">
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates select="node()" mode="copy-no-namespaces"/>
    </xsl:element>
</xsl:template>

<xsl:template match="comment()| processing-instruction()" mode="copy-no-namespaces">
    <xsl:copy/>
</xsl:template>

</xsl:stylesheet>

这是模拟XSLT1.0中的copy-namespaces="no"的标准方法,正如Michael所描述的here。那么,结果将是

代码语言:javascript
复制
$ xml tr --xinclude x.xsl a.xml
<?xml version="1.0"?>
<doc>
a
<snippet>
c
</snippet>
b
</doc>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29298507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档