列表子列表的XSLT逗号分隔(复杂情况)

时间:2015-09-08 11:01:20

标签: xml xslt

真正的xml结构

<GTD>
<BLOCK>
  <G44>
    <G4403>1</G4403>
    <G441>02001</G441>
    <G442>N/A</G442>
    <G443>2015-04-12</G443>
  </G44>
  <G44>
    <G4403>1</G4403>
    <G441>02015</G441>
    <G442>143561</G442>
    <G443>2015-07-28</G443>
  </G44>
  <G44>
    <G4403>1</G4403>
    <G441>03011</G441>
    <G442>SRSC-3399709-2015</G442>
    <G443>2014-12-01</G443>
  </G44>
  <G44>
    <G4403>1</G4403>
    <G441>02015</G441>
    <G442>143537</G442>
    <G443>2015-07-26</G443>
  </G44>
  <G44>
    <G4403>1</G4403>
    <G441>03012</G441>
    <G442>1</G442>
    <G443>2014-12-01</G443>
  </G44>
</BLOCK>
<BLOCK>
  ...
</BLOCK>
</GTD>
结果XML中的

我必须从每个 G44 获得 G441 = 02015 带逗号分隔符的连续字符串

<GTD>
<LINE>
  <DOCNUMBER>
    143561, 143537
  </DOCNUMBER>
</LINE>
</GTD>

与另一个问题相关的问题(XSLT comma separation for sublist of list

1 个答案:

答案 0 :(得分:1)

不确定为什么要标记这个“复杂案例”;)。以下是使用XSLT执行此操作的方法:

<xsl:template match="/">
    <GTD><LINE><DOCNUMBER>
    <xsl:apply-templates select="GTD/BLOCK/G44[G441 = '02015']" />
    </DOCNUMBER></LINE></GTD>
</xsl:template>

<xsl:template match="G44">
    <xsl:value-of select="G442" />
    <xsl:if test="position() != last()">
        <xsl:text>, </xsl:text>
    </xsl:if>
</xsl:template>

这导致:

<GTD>
  <LINE>
    <DOCNUMBER>143561, 143537</DOCNUMBER>
  </LINE>
</GTD>

更新,添加评论

的建议

根据您对PACKNUMBER的评论

,提供有关如何展开此内容的提示
<xsl:template match="/">
    <GTD><LINE>
        <DOCNUMBER>
            <xsl:apply-templates select="GTD/BLOCK/G44[G441 = '02015']" />
        </DOCNUMBER>
        <PACKNUMBER>
            <xsl:apply-templates select="GTD/BLOCK/G44[G441 = '02001']" />
        </PACKNUMBER>
    </LINE></GTD>
</xsl:template>

<xsl:template match="G44[G441 = '02015']">
    <xsl:value-of select="G442" />
    <xsl:if test="position() != last()">
        <xsl:text>, </xsl:text>
    </xsl:if>
</xsl:template>

<xsl:template match="G44[G441 = '02001']">
    <xsl:value-of select="G441" />
    <xsl:text>, </xsl:text>
    <xsl:value-of select="G443" />
    <xsl:if test="position() != last()">
        <xsl:text>, </xsl:text>
    </xsl:if>
</xsl:template>

您可以决定是要重复谓词还是切换模式。但基本上,这样做的方法是:

  • 通过添加新的apply-templates
  • 添加新集合
  • 通过添加新的匹配模板
  • 来描述您想要的内容

如果重叠(为另一个集合生成相同的输出),您可以使用match="G44[G441 = '02015' or G441 = 'xyz]">在一个中添加多个匹配。