我有如下的Source XML:
<ROOT>
<RECORD>
<Tag1>Tag1 Value</Tag1>
<Tag2>
<TagA1>TagA1 Value</TagA1>
<TagA2>TagA2 Value</TagA2>
<TagA3>TagA3 Value</TagA3>
</Tag2>
<Tag1>Tag1 Value</Tag1>
</RECORD>
<RECORD>
<Tag1>Tag1 Value</Tag1>
<Tag2>
<TagA1>TagA1 Value</TagA1>
<TagA2>TagA2 Value</TagA2>
</Tag2>
<Tag1>Tag1 Value</Tag1>
</RECORD>
</ROOT>
我需要这个如下::
<ROOT>
<RECORD>
<Tag1>Tag1 Value</Tag1>
<Tag2>TagA1 Value | TagA2 Value | TagA3 Value</Tag2>
<Tag1>Tag1 Value</Tag1>
</RECORD>
<RECORD>
<Tag1>Tag1 Value</Tag1>
<Tag2>TagA1 Value | TagA2 Value</Tag2>
<Tag1>Tag1 Value</Tag1>
</RECORD>
</ROOT>
我必须将原始XML提供给此表单,以便我们如何使用XSLT实现该目标?
答案 0 :(得分:1)
这是生成所需输出的一种可能性:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="RECORD/*[*]">
<xsl:copy>
<xsl:for-each select="*">
<xsl:value-of select="."/>
<xsl:if test="position() != last()"> | </xsl:if>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:1)
我认为你可以实现这一点,我有一个模板来匹配RECORD元素的'grand-child'节点,并简单地输出值。例如
<xsl:template match="RECORD/*/*">
<xsl:value-of select="." />
</xsl:template>
但是,你需要为第一个和后续节点分别设置案例来处理|他们之间的性格。试试这个XSLT作为替代
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="RECORD/*/*[1]">
<xsl:value-of select="." />
</xsl:template>
<xsl:template match="RECORD/*/*[position() > 1]">
<xsl:value-of select="concat(' | ', .)" />
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:0)
另一个变体(使用已经提出的想法,但我认为是最简单的方法,不使用<xsl:for-each>
):
<强> XSLT:强>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="no" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- Identity Template: copies everything as-is -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- For all grandchildren of <RECORD> elements, concat them, using -->
<!-- a pipe as a delimiter (as long as we're not on the last element) -->
<xsl:template match="RECORD/*/*">
<xsl:value-of select="." />
<xsl:if test="position() != last()">
<xsl:text> | </xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
INPUT XML:
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<RECORD>
<Tag1>Tag1 Value</Tag1>
<Tag2>
<TagA1>TagA1 Value</TagA1>
<TagA2>TagA2 Value</TagA2>
<TagA3>TagA3 Value</TagA3>
</Tag2>
<Tag1>Tag1 Value</Tag1>
</RECORD>
<RECORD>
<Tag1>Tag1 Value</Tag1>
<Tag2>
<TagA1>TagA1 Value</TagA1>
<TagA2>TagA2 Value</TagA2>
</Tag2>
<Tag1>Tag1 Value</Tag1>
</RECORD>
</ROOT>
<强>输出:强>
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<RECORD>
<Tag1>Tag1 Value</Tag1>
<Tag2>TagA1 Value | TagA2 Value | TagA3 Value</Tag2>
<Tag1>Tag1 Value</Tag1>
</RECORD>
<RECORD>
<Tag1>Tag1 Value</Tag1>
<Tag2>TagA1 Value | TagA2 Value</Tag2>
<Tag1>Tag1 Value</Tag1>
</RECORD>
</ROOT>