我有一个XML结构,如下面作为映射工具步骤的一部分。
<?xml version="1.0" encoding="UTF-8"?>
<multimap:Messages xmlns:multimap="http://google.com/z/Z/SplitAndMerge">
<multimap:Message1>
<Response>
<Employment><status>OK</status></Employment>
</Responses>
<Responses>
<Term><status>OK</status></Term>
</Responses>
</multimap:Message1>
</multimap:Messages>
我需要将每个Response分成单独的Message编号,如下所示。
<?xml version="1.0" encoding="UTF-8"?>
<multimap:Messages xmlns:multimap="http://google.com/z/Z/SplitAndMerge">
<multimap:Message1>
<Response>
<Employment><status>OK</status></Employment>
</Responses>
</multimap:Message1>
<multimap:Message2>
<Responses>
<Term><status>OK</status></Term>
</Responses>
</multimap:Message2>
</multimap:Messages>
有没有办法使用XSLT实现这一目标?
答案 0 :(得分:1)
您可以处理每个Response
(或Responses
,您的示例不一致)并将其包装到Message元素中:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select="*/Response"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Response">
<xsl:element name="multimap:Message{position()}" xmlns:multimap="http://google.com/z/Z/SplitAndMerge">
<xsl:copy-of select="."/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/94hvTyY
这是XSLT 3,如果你使用XSLT 2处理器,你需要用身份转换模板替换<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
答案 1 :(得分:0)
<xsl:template match="multimap:Messages">
<xsl:element name="multimap:Messages">
<xsl:for-each select="multimap:Message1/Responses">
<xsl:element name="{concat('multimap:Message',position())}">
<xsl:copy-of select="."/>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>