我是 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>
这些是我应该遵循的要点:
我写的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 会删除这些空格并留下闭合标签吗?如果是,是否有办法避免这种行为?
由于某种原因它什么也没做。
这不是真的。它做了一些事情:它抛出一个错误:
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"
。我不知道你是否真的想要这个,或者这只是“巫术编程”的尝试,但它会显着改变结果。