带有逗号分隔列表的节点。获取不同的值并创建新节点

问题描述 投票:0回答:1

我需要创建一个 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-2.0 xslt-3.0 xslt-grouping
1个回答
0
投票

对标记化值进行分组似乎是正确的方法,下次考虑展示一种方法以及它是如何失败的,这里是一个 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"

© www.soinside.com 2019 - 2024. All rights reserved.