通过另一个节点进行xslt分组

时间:2018-12-10 12:04:49

标签: xml xslt

我有以下xml

 <root xmlns="">
<General>
  <Data>
    <Number>123456</Number>
    <Date>2018-10-22</Data>
    <LineRefer>0001</LineRefer>
    <LineRefer>0002</LineRefer>
  </Data>
  <Data>
    <Number>789456</Number>
    <Date>2018-10-22</Data>
    <LineRefer>0003</LineRefer>
    <LineRefer>0004</LineRefer>
  </Data>
</General>
<Services>
  <Details>
    <LineNumber>0001</LineNumber>
    <Description>test description</Description>
  </Details>
  <Details>
    <LineNumber>0002</LineNumber>
    <Description>test description</Description>
  </Details>
  <Details>
    <LineNumber>0003</LineNumber>
    <Description>test description</Description>
  </Details>
  <Details>
    <LineNumber>0004</LineNumber>
    <Description>test description</Description>
  </Details>
 </root>

我希望我可以分组以获得这个结果

数字123456
0001测试说明
0002测试说明

号码789456
0003测试说明
0004测试说明

这是我的xml xsl

<?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

   <xsl:output method="html" />
    <xsl:template match="/">
     <html>
       <head>
    <title>HTML Document Example</title>
  </head>
  <body>
    <div class="page">
      <xsl:for-each select="root" >
        <xsl:for-each select="Services/Details" >
          <ul>
            <li><xsl:value-of select="LineNumber" /> | <xsl:value-of   select="Description" /> </li>
        </ul>
        </xsl:for-each>
      </xsl:for-each>
    </div>
  </body>
</html>
</xsl:template>
</xsl:stylesheet>

结果

0001测试说明
0002测试说明
0003测试说明
0004测试说明

预先感谢

1 个答案:

答案 0 :(得分:0)

首先要尝试选择Services/Details,这会使您自己变得更加困难,因为您将不得不担心分组。但是,您的General/Data元素中的数据已经“分组”了,所以从选择这些元素开始。

要获取相关Services/Details的详细信息,请先定义一个密钥。...

<xsl:key name="services" match="Services/Details" use="LineNumber" />

然后,将其放置在Data元素上,就可以像这样获得所有相关的详细信息...

<xsl:for-each select="key('services', LineRefer)">

尝试此XSLT

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

  <xsl:key name="services" match="Services/Details" use="LineNumber" />

  <xsl:template match="root">
    <html>
    <head>
      <title>HTML Document Example</title>
    </head>
    <body>
      <div class="page">
        <xsl:for-each select="General/Data" >
          <h1><xsl:value-of select="Number" /></h1>
          <ul>
            <xsl:for-each select="key('services', LineRefer)">
               <li><xsl:value-of select="LineNumber" /> | <xsl:value-of   select="Description" /> </li>
            </xsl:for-each>
          </ul>
        </xsl:for-each>
      </div>
    </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

有关实际操作,请参见http://xsltfiddle.liberty-development.net/nc4NzRw

请注意,您的XML在xmlns=""元素上显示root。如果在您的实际XML中,此xmlns不为空,则意味着您的XML元素都位于默认名称空间中,并且上述XSLT将不起作用。

在这种情况下,您应该更改XSLT以解决名称空间问题。这里有很多关于如何在XSLT 1.0中处理默认名称空间的示例,但由于让我感到圣诞节风,请看一下http://xsltfiddle.liberty-development.net/nc4NzRw/1作为示例。