【发布时间】:2015-03-18 14:38:27
【问题描述】:
我有以下输入 XML:
<root>
<element>
<id>1</id>
<text><![CDATA[My text 1]]></text>
</element>
<element>
<id>2</id>
<text><![CDATA[My text 1]]></text>
</element>
<element>
<id>3</id>
<text><![CDATA[My text 2]]></text>
</element>
<element>
<id>4</id>
<text><![CDATA[My text 2]]></text>
</element>
<element>
<id>5</id>
<text><![CDATA[My text 3]]></text>
</element>
</root>
我希望使用 XSLT 2.0 对其进行转换,以拆分文本元素中的重复 text() 并将我的非重复项组合到单独的文件中(对于任意数量的重复项 - 我的示例只显示两个)。所以我的任何输出文件中都不应该有重复的 text() ,并且它们需要被分组到尽可能少的文件中。我上面的输出应该是这样的:
document1.xml
<root>
<element>
<id>1</id>
<text><![CDATA[My text 1]]></text>
</element>
<element>
<id>3</id>
<text><![CDATA[My text 2]]></text>
</element>
<element>
<id>5</id>
<text><![CDATA[My text 3]]></text>
</element>
</root>
document2.xml
<root>
<element>
<id>2</id>
<text><![CDATA[My text 1]]></text>
</element>
<element>
<id>4</id>
<text><![CDATA[My text 2]]></text>
</element>
</root>
我现有的 XSLT sn-p 看起来像这样:我觉得我需要在我的 for-each-group 中收集我的重复项(以便按位置拆分),但显然这会导致每个元素一个文件:
<xsl:for-each-group select="descendant::element" group-by="text[text() = preceding::text/text() or text() = following::text/text()]">
<xsl:result-document href="{concat($outputdir,'\document',position(),'.xml')}" method="xml" indent="yes" cdata-section-elements="text">
<root>
<xsl:copy-of select="."/>
</root>
</xsl:result-document>
</xsl:for-each-group>
感谢您提供的任何帮助。提前致谢。
【问题讨论】:
-
看起来你的输入和输出不同步..请你看一下并更清楚地解释逻辑。
-
感谢现场:我已更新 ID 以使其更准确。所以我的任何输出文件中都没有重复的
,它们被分组到尽可能少的文件中。