LOOP-1、2和3元素是unbounded.below,它包含所有的Loop-1元素,然后是Loop-2元素。我们如何将其转换为类似的输出xml.我在下面的xslt中尝试过,但它给出了相同的输入。
输入xml:
<root>
<LOOP-1><!-- unbounded -->
<element1>A</element1>
</LOOP-1>
<LOOP-1>
<element1>A</element1>
</LOOP-1>
<LOOP-2><!-- unbounded -->
<element2>B</element2>
</LOOP-2>
<LOOP-2>
<element2>B</element2>
</LOOP-2>
</root>XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>输出:
<?xml version="1.0"?>
<root>
<LOOP-1>
<element1>A</element1>
</LOOP-1>
<LOOP-2>
<element2>B</element2>
</LOOP-2>
<LOOP-1>
<element1> A</element1>
</LOOP-1>
<LOOP-2>
<element2>B</element2>
</LOOP-2>
</root>发布于 2014-01-14 15:13:07
您可以尝试以下代码:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/root">
<xsl:for-each select="child::LOOP-1">
<xsl:variable name="pos" select="position()"/>
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
<xsl:apply-templates select="following-sibling::LOOP-2[position()=$pos]"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>发布于 2014-01-14 16:50:35
如果你想处理任意数量的循环元素(你在第一句话中提到了1,2和3,但在你的例子中实际上没有显示3),你可以做的是定义一个键来帮助根据元素的‘数字’来查找它们。
<xsl:key name="loop" match="*[starts-with(local-name(), 'LOOP')]" use="substring-after(local-name(), '-')" />然后只选择-1\f25LOOP-1\f6元件
<xsl:apply-templates select="key('loop', '1')" />接下来,您将拥有一个share模板来匹配任何循环元素,而不考虑元素的数量
在其中,您将调用标识模板来复制元素,然后调用apply-templates来选择具有下一个编号但位置相同的循环元素:
<xsl:apply-templates select="key('loop', string(number(substring-after(local-name(), '-')) + 1))[$pos]" />试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />
<xsl:key name="loop" match="*[starts-with(local-name(), 'LOOP')]" use="substring-after(local-name(), '-')" />
<xsl:template match="root">
<root>
<xsl:apply-templates select="key('loop', '1')" />
</root>
</xsl:template>
<xsl:template match="*[starts-with(local-name(), 'LOOP')]">
<xsl:call-template name="identity" />
<xsl:variable name="pos" select="position()" />
<xsl:apply-templates select="key('loop', string(number(substring-after(local-name(), '-')) + 1))[$pos]" />
</xsl:template>
<xsl:template match="@*|node()" name="identity">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>https://stackoverflow.com/questions/21106685
复制相似问题