XML 转换 - 复制节点并将字符串连接到现有标签值

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

我是 xsltproc 新手,想要转换此 XML:

<services>
    <event name="Something.zip">
        <enabled>true</enabled>
        <bindings>
            <binding name="Example">
                <machine>example-name</machine>
                <product>
                    <type>Shared</type>
                    <version>1.0</version>
                    <location>/path/to/something</location>
                </product>
            </binding>
        </bindings>
    </event>
</services>

对于这个:

<services>
    <event name="Something.zip">
        <enabled>true</enabled>
        <bindings>
            <binding name="Example">
                <machine>example-name</machine>
                <product>
                    <type>Shared</type>
                    <version>1.0</version>
                    <location>/path/to/something</location>
                </product>
            </binding>
            <binding name="Example-1">
                <machine>example-name-test</machine>
                <product>
                    <type>Shared</type>
                    <version>1.0</version>
                    <location>/path/to/something</location>
                </product>
            </binding>
        </bindings>
    </event>
</services>

这些是我应该遵循的要点:

  1. 应保留所有原始 .xml 文件内容。
  2. 在绑定内部,我需要复制当前绑定并获取其名称并向其添加“-1”。另外,我需要将“-test”添加到“machine”标签内的值。
  3. 每个绑定的名称可能会有所不同,因此,我不能依赖字符串“Example”作为常量输入。 “machine”标签内的值也是如此。
  4. 假设每个 .xml 文件中只有一个标签,并且其中始终有 1 个绑定。

我写的insert.xsl:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="http://some/xml/namespace">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="node()|@*" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="binding">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
            <xsl:attribute name="name">
                <xsl:value-of select="concat(@name, '-1')"/>
            </xsl:attribute>
            <machine>
                <xsl:value-of select="concat(machine, '-test')"/>
            </machine>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

由于某种原因它什么也没做。

P.S,如果我的标签值带有空格,xsltproc 会删除这些空格并留下闭合标签吗?如果是,是否有办法避免这种行为?

xml xslt transformation clob
1个回答
0
投票

由于某种原因它什么也没做。

这不是真的。它做了一些事情:它抛出一个错误:

Cannot add attributes to an element if children have been already added to the element.

要获得您显示的结果,请尝试以下操作:

<xsl:template match="binding">
    <xsl:copy-of select="."/>
    <binding name="{@name}-1">
        <machine>
            <xsl:value-of select="concat(machine, '-test')"/>
        </machine>
        <xsl:copy-of select="product"/>
    </binding>
</xsl:template>

请注意,您的样式表声明了默认命名空间

xmlns="http://some/xml/namespace"
。我不知道你是否真的想要这个,或者这只是“巫术编程”的尝试,但它会显着改变结果。

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