首页 文章

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

提问于
浏览
0

我有以下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>

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

number 123456
0001测试说明
0002测试说明

number 789456
0003测试说明
0004测试说明

这是我的xsl for xml

<?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

    你首先尝试选择 Services/Details ,这让你自己变得更加困难,因为你不得不担心分组 . 但是, General/Data 元素中的数据已经是"grouped",因此请从选择这些元素开始 .

    要获得相关 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在 root 元素上显示 xmlns="" . 如果在您的实际XML中,此 xmlns 不为空,则表示您的XML元素都在默认命名空间中,并且上述XSLT将不起作用 .

    如果是这种情况,则应更改XSLT以考虑命名空间 . 有很多关于如何在StackOverflow上处理XSLT 1.0中的默认命名空间的例子,但是当我感觉到Christmassy时,请看一下http://xsltfiddle.liberty-development.net/nc4NzRw/1的例子 .

相关问题