我需要创建一个 xml 输出,将所有 wd:External_Value_Data/wd:Text 字段与每个不同的内部值分组。
<wd:root>
<wd:Integration_Map_Value_Data>
<wd:Internal_Value_Data>
<wd:Text>A1</wd:Text>
</wd:Internal_Value_Data>
<wd:External_Value_Data>
<wd:Text>3402948659753553924</wd:Text>
</wd:External_Value_Data>
</wd:Integration_Map_Value_Data>
<wd:Integration_Map_Value_Data>
<wd:Internal_Value_Data>
<wd:Text>A1,A2</wd:Text>
</wd:Internal_Value_Data>
<wd:External_Value_Data>
<wd:Text>3402949092169519108</wd:Text>
</wd:External_Value_Data>
</wd:Integration_Map_Value_Data>
<wd:Integration_Map_Value_Data>
<wd:Internal_Value_Data>
<wd:Text>A1,A2</wd:Text>
</wd:Internal_Value_Data>
<wd:External_Value_Data>
<wd:Text>3402949293873597442</wd:Text>
</wd:External_Value_Data>
</wd:Integration_Map_Value_Data>
<wd:Integration_Map_Value_Data>
<wd:Internal_Value_Data>
<wd:Text>A1,A2,A3</wd:Text>
</wd:Internal_Value_Data>
<wd:External_Value_Data>
<wd:Text>3402949293873597654977</wd:Text>
</wd:External_Value_Data>
</wd:Integration_Map_Value_Data>
</wd:root>
我尝试了某些形式的标记化但没有成功。我对 xslt 2.0 或 3.0 中的解决方案持开放态度。
<root>
<record>
<type>A1</type>
<document>3402948659753553924</document>
<document>3402949092169519108</document>
<document>3402949293873597442</document>
<document>3402949293873597654977</document>
</record>
<record>
<type>A2</type>
<document>3402949092169519108</document>
<document>3402949293873597442</document>
<document>3402949293873597654977</document>
</record>
<record>
<type>A3</type>
<document>3402949293873597654977</document>
</record>
</root>
对标记化值进行分组似乎是正确的方法,下次考虑展示一种方法以及它是如何失败的,这里是一个 XSLT 3.0 样式表:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xpath-default-namespace="http://example.com"
exclude-result-prefixes="#all"
expand-text="yes">
<xsl:template match="root">
<root>
<xsl:for-each-group select="Integration_Map_Value_Data" group-by="tokenize(Internal_Value_Data/Text, ',')">
<record>
<type>{current-grouping-key()}</type>
<xsl:apply-templates select="current-group()/External_Value_Data/Text"/>
</record>
</xsl:for-each-group>
</root>
</xsl:template>
<xsl:template match="Text">
<document>{.}</document>
</xsl:template>
<xsl:output indent="yes"/>
<xsl:mode on-no-match="shallow-copy"/>
</xsl:stylesheet>
这需要
wd
元素的命名空间来代替 xpath-default-namespace="http://example.com"
。