我有一个xml文档,我需要用包含节点和处理指令的部分xml段替换特定节点。我想保留PI,但是我遇到了替代问题。
细分示例:general.xml
<root>
<!--General Settings -->
<?mapping EnvironmentSetting="envname"?>
<setting name="SubscriptionName" value="*" />
</root>
来源xml:
<environment>
<General />
</environment>
转换 -
<xsl:template match="* | processing-instruction() | comment()">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="*/General">
<xsl:copy-of select="document('general.xml')/root"/>
</xsl:template>
输出结果为:
<environment>
<root>
<!--General Settings -->
<?mapping EnvironmentSetting="envname"?>
<setting name="SubscriptionName" value="*" />
</root>
</environment>
但我想:
<environment>
<!--General Settings -->
<?mapping EnvironmentSetting="envname"?>
<setting name="SubscriptionName" value="*" />
</environment>
将文档部分更改为root / *会删除处理指令(和注释)
<xsl:copy-of select="document('general.xml')/root/*"/>
...
<environment>
<setting name="SubscriptionName" value="*" />
</environment>
将文档部分更改为root / process-instructions会删除节点
<xsl:copy-of select="document('general.xml')/root/processing-instruction()"/>
...
<environment>
<?mapping EnvironmentSetting="envname"?>
</environment>
尝试做一个|只匹配第一个参数 -
<xsl:copy-of select="document('general.xml')/root/processing-instruction() | * | comment()"/>
...
<environment>
<?mapping EnvironmentSetting="envname"?>
</environment>
那么如何获得蛋糕并吃掉呢?我似乎非常接近,但在找到做我想做的事情的例子时遇到了问题。
答案 0 :(得分:0)
这应该这样做:
<xsl:template match="* | processing-instruction() | comment()">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="*/General">
<xsl:apply-templates select="document('general.xml')/root"/>
</xsl:template>
<xsl:template match="root">
<xsl:apply-templates select="node() | @*"/>
</xsl:template>
或者,您可以使用union运算符复制几种类型的节点:
<xsl:template match="*/General">
<xsl:variable name="r" select="document('general.xml')/root" />
<xsl:apply-templates select="$r/* | $r/processing-instruction() | $r/comment()" />
</xsl:template>