0

对于这个 xml:

 <G>
        <P>
            <A>
                <b>value b</b>
                <c>value c</c>
            </A>
            <A>
                <b>value b2</b>
                <c>value c2</c>
            </A>
            <D>value ew</D>
        <D>value e2</D>     
            <E>value f</E>
        </P>
        <P>
            <A>
                <b>value bx</b>
                <c>value cx</c>
            </A>
            <A>
                <b>value b2x</b>
                <c>value c2x</c>
            </A>
             <D>value exw</D>
        <D>value ex2</D>

         <D>value ex2</D>
            <E>value fx</E>
        </P>
    </G>

像 A 和 D 这样的标签可以出现多次,我正在处理的原始 xml 有大量标签,其中许多标签多次出现。我必须生成输出为:
值 b 值 c 值 ew 值 f
值 b 值 c 值 e2 值 f
值 b2 值 c2 值 ew 值 f
值 b2 值 c2 值 e2 值 f
值 bx 值 cx 值 exw 值 fx
值 bx 值cx 值 ex2 值 fx
值 bx 值 cx 值 ex3 值 fx
值 b2x 值 c2x 值 exw 值 fx
值 b2x 值 c2x 值 ex2 值 fx
值 b2x 值 c2x 值 ex3 值 fx

如果 A 标记多次出现,则此 xslt 生成正确的输出,但是当上述 xml 中的其他标记(如 D 重复)时,此操作不起作用。

<xsl:for-each select="//A">
    <xsl:value-of select="b"/>
    <xsl:text>,</xsl:text>
    <xsl:value-of select="c"/>
    <xsl:text>,</xsl:text>
    <xsl:value-of select="ancestor::P/D"/>
    <xsl:text>,</xsl:text>
    <xsl:value-of select="ancestor::P/E"/>
    <xsl:text>  
</xsl:text>
</xsl:for-each>

请建议正确的 xslt

4

2 回答 2

1

这是一个可能的解决方案:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:variable name='s' select='","' />
    <xsl:template match="A">
        <xsl:variable name='b' select='b' />
        <xsl:variable name='c' select='c' />
        <xsl:for-each select="../D"><xsl:value-of select='$b' /><xsl:value-of select='$s' /><xsl:value-of select='$c' /><xsl:value-of select='$s' /><xsl:value-of select='.'/><xsl:value-of select='$s' /><xsl:value-of select='../E'/><xsl:text>
</xsl:text></xsl:for-each>
    </xsl:template>
    <xsl:template match="text()" />
</xsl:stylesheet>

请注意,它会查找所有 A,并为每个 A 为 A 的每个 D 兄弟输出一行。请注意,请确保这是您想要的

它给出了输出:

value b,value c,value ew,value f
value b,value c,value e2,value f
value b2,value c2,value ew,value f
value b2,value c2,value e2,value f
value bx,value cx,value exw,value fx
value bx,value cx,value ex2,value fx
value bx,value cx,value ex2,value fx
value b2x,value c2x,value exw,value fx
value b2x,value c2x,value ex2,value fx
value b2x,value c2x,value ex2,value fx
于 2012-07-11T07:42:40.077 回答
1

我认为这可以通过重复调用模板来实现。首先,您有一个匹配A的模板,但不是输出bc元素,而是将它们作为参数传递给与 D 元素匹配的模板

<xsl:template match="A">
  <xsl:apply-templates select="following-sibling::D">
     <xsl:with-param name="prefix">
        <xsl:value-of select="b"/>
        <xsl:text>,</xsl:text>
        <xsl:value-of select="c"/>
     </xsl:with-param>
  </xsl:apply-templates>
</xsl:template>

然后,在与D元素匹配的模板中,将前缀与 D 的值连接起来,并将其传递给与E元素匹配的模板。

<xsl:template match="D">
  <xsl:param name="prefix"/>
  <xsl:apply-templates select="following-sibling::E">
     <xsl:with-param name="prefix">
        <xsl:value-of select="$prefix"/>
        <xsl:text>,</xsl:text>
        <xsl:value-of select="."/>
     </xsl:with-param>
  </xsl:apply-templates>
</xsl:template>

然后匹配E元素的模板可以输出整个字符串。这是完整的 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="text" indent="yes"/>

   <xsl:template match="/">
      <xsl:apply-templates select="//A"/>
   </xsl:template>

   <xsl:template match="A">
      <xsl:apply-templates select="following-sibling::D">
         <xsl:with-param name="prefix">
            <xsl:value-of select="b"/>
            <xsl:text>,</xsl:text>
            <xsl:value-of select="c"/>
         </xsl:with-param>
      </xsl:apply-templates>
   </xsl:template>

   <xsl:template match="D">
      <xsl:param name="prefix"/>
      <xsl:apply-templates select="following-sibling::E">
         <xsl:with-param name="prefix">
            <xsl:value-of select="$prefix"/>
            <xsl:text>,</xsl:text>
            <xsl:value-of select="."/>
         </xsl:with-param>
      </xsl:apply-templates>
   </xsl:template>

   <xsl:template match="E">
      <xsl:param name="prefix"/>
      <xsl:value-of select="$prefix"/>
      <xsl:text>,</xsl:text>
      <xsl:value-of select="."/>
      <xsl:value-of select="'&#13;'"/>
   </xsl:template>
</xsl:stylesheet>

应用于您的 XML 示例时,将输出以下内容

value b,value c,value ew,value f
value b,value c,value e2,value f
value b2,value c2,value ew,value f
value b2,value c2,value e2,value f
value bx,value cx,value exw,value fx
value bx,value cx,value ex2,value fx
value bx,value cx,value ex2,value fx
value b2x,value c2x,value exw,value fx
value b2x,value c2x,value ex2,value fx
value b2x,value c2x,value ex2,value fx
于 2012-07-11T07:54:43.473 回答