Xml XSLT:Copy元素及其周围元素(递归循环错误)
我正在努力找到这个问题的解决方案,因为我最终陷入了一个递归循环 XML源代码示例:Xml XSLT:Copy元素及其周围元素(递归循环错误),xml,xslt,xpath,xsd,transformation,Xml,Xslt,Xpath,Xsd,Transformation,我正在努力找到这个问题的解决方案,因为我最终陷入了一个递归循环 XML源代码示例: <runtime xmlns="http://xxx/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="xxx.xsd"> <messages> <message> <severity>debug&
<runtime xmlns="http://xxx/v1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="xxx.xsd">
<messages>
<message>
<severity>debug</severity>
<source>Client</source>
<subject>Subject</subject>
<body>Body</body>
</message>
</messages>
调试
客户
主题
身体
我需要把Messages元素放在body元素的内部
<runtime xmlns="http://xxx/v1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="xxx.xsd">
<messages>
<message>
<severity>debug</severity>
<source>Client</source>
<subject>Subject</subject>
<body>
<messages>
<message>
<severity>debug</severity>
<source>Client</source>
<subject>Subject</subject>
<body>Body</body>
</message>
</messages>
</body>
</message>
</messages>
调试
客户
主题
调试
客户
主题
身体
我不能想出一个有效的解决方案而不以循环错误告终。任何帮助都是有代价的 您可以从以下一个角度来看待它: XSLT1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:v1="http://xxx/v1">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="v1:body">
<xsl:copy>
<xsl:copy-of select="../.."/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
作为一项智力练习,在XSLT 2.0中,您可以:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="http://xxx/v1">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<!-- identity transform -->
<xsl:template match="@*|node()" mode="#all">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="#current"/>
</xsl:copy>
</xsl:template>
<xsl:template match="body">
<xsl:copy>
<xsl:apply-templates select="../.." mode="copy"/>
</xsl:copy>
</xsl:template>
<xsl:template match="body" mode="copy">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
除了
元素之外,您必须运行一个复制模板。对于这个特殊的标记,创建另一个名为的复制模板,以从新开始驱动转换,并使用ordrer中的另一个路径来避免循环
正文的经典复制模板execpt
<xsl:template match="node()[local-name()!='body'] | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
对于body元素,通过指定另一个路径(使用模式)从头开始复制
并使用另一个复制模板将标记复制到body元素中
<xsl:template match="node() | @*" mode="embedded">
<xsl:copy>
<xsl:apply-templates select="node() | @*" mode="embedded"/>
</xsl:copy>
</xsl:template>
因此:
<?xml version="1.0" encoding="UTF-8"?>
<runtime xmlns="http://xxx/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="xxx.xsd">
<messages>
<message>
<severity>debug</severity>
<source>Client</source>
<subject>Subject</subject>
<body>
<messages>
<message>
<severity>debug</severity>
<source>Client</source>
<subject>Subject</subject>
<body>Body</body>
</message>
</messages>
</body>
</message>
</messages>
</runtime>
调试
客户
主题
调试
客户
主题
身体
<?xml version="1.0" encoding="UTF-8"?>
<runtime xmlns="http://xxx/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="xxx.xsd">
<messages>
<message>
<severity>debug</severity>
<source>Client</source>
<subject>Subject</subject>
<body>
<messages>
<message>
<severity>debug</severity>
<source>Client</source>
<subject>Subject</subject>
<body>Body</body>
</message>
</messages>
</body>
</message>
</messages>
</runtime>