在 Linux 上通过 xsltproc 将 XML 块插入到 .xml 文件中

问题描述 投票:0回答:1

我有这个原始的.xml 文件树:

<?xml version="1.0"?>
<root xmlns="http://www.tibco.com/xmlns/">
    <element1>
        <name>Hi</name>
    </element1>
    <element2>
        <name>Beer</name>
    </element2>
    <element2>
        <name>Balloon</name>
        <element2_1>
            <name>John</name>
        </element2_1>
    </element2> 
</root>

我正在尝试在 element2 父级下添加 element2_2。我尝试基于“xsl:元素匹配”进行插入(xslt 样式表作为脚本的一部分),如下所示:

cat <<EOT > insert.xsl
<?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" indent="yes"/>

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="root/element2[@name='Balloon']">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
    <xsl:element name="element2_2">
        <xsl:attribute name="name">Edward</xsl:attribute>
    </xsl:element>
</xsl:template>
</xsl:stylesheet>
EOT

然后使用xsltproc根据Linux上的特定位置(标签和元素)将insert.xsl插入到original.xml中:

xsltproc insert.xsl original.xml > ./updated.xml

不幸的是什么也没发生。我发现的唯一工作是将匹配模式更改为根(“/*”)并将 xsl:element 编辑为实际的 .xml 元素,这导致在 root 之后连接元素(不是有用的)。

所需输出:

<root>
        <element1>
            <name>Hi</name>
        </element1>
        <element2>
            <name>Beer</name>
        </element2>
        <element2>
            <name>Balloon</name>
            <element2_1>
                <name>John</name>
            </element2_1>
            <element2_2>
                <name>Edward</name>
            </element2_2>
        </element2> 
    </root>

假设环境之间没有差异。

linux xml xslt
1个回答
0
投票

@name
选择 XML 中没有的属性,所以我怀疑您只是想要

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="root/element2[name='Balloon']">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
        <element2_2>
          <name>Edward</name>
        </element2_2>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

使用客户端 JavaScript 进行演示(在基于 Chromium 的浏览器中,libxslt 与 xsltproc 中的处理器相同):

const xmlSource = `<root>
    <element1>
        <name>Hi</name>
    </element1>
    <element2>
        <name>Beer</name>
    </element2>
    <element2>
        <name>Balloon</name>
        <element2_1>
            <name>John</name>
        </element2_1>
    </element2> 
</root>`;

const domParser = new DOMParser();

const xmlDoc = domParser.parseFromString(xmlSource, 'application/xml');

const xsltSource = `<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="root/element2[name='Balloon']">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
        <element2_2>
          <name>Edward</name>
        </element2_2>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>`;

const xsltDoc = domParser.parseFromString(xsltSource, 'application/xml');

const xsltProc = new XSLTProcessor();
xsltProc.importStylesheet(xsltDoc);

const resultDoc = xsltProc.transformToDocument(xmlDoc);

//console.log(resultDoc);

console.log(new XMLSerializer().serializeToString(resultDoc));

© www.soinside.com 2019 - 2024. All rights reserved.