【问题标题】:Create key to group xml nodes with xslt language?创建密钥以使用 xslt 语言对 xml 节点进行分组?
【发布时间】:2023-03-26 12:21:01
【问题描述】:

我有以下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测试说明

提前致谢

【问题讨论】:

  • 欢迎来到 SO。你试过什么了 ?检查How to ask。此外,您的 XML 似乎不正确(可能是拼写错误?)&lt;/Data&gt; 而不是 &lt;/Date&gt; 而不是 &lt;/Services&gt;
  • 据我所知,数据已经分组了。您需要做的就是从相应的行中获取描述。为此,最好使用key
  • @micheal.hor257k :我可以看到服务列表,但无法插入 Data 行。如何使用密钥?
  • 恐怕我不明白你的意思。发布您当前的 XSLT,以便我们帮助您修复它。 -- 并尝试正确拼写我的名字,以便我收到通知。
  • 听起来您正在选择Services/Details 元素,然后尝试获取关联的Data 元素。如果是这样,您应该颠倒逻辑。从获取Data 元素开始,对于每个Data 元素,使用密钥获取服务。

标签: html xml xslt


【解决方案1】:

首先尝试选择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 在 root 元素上显示 xmlns=""。如果在您的实际 XML 中,此 xmlns 不为空,那么这意味着您的 XML 元素都在默认名称空间中,并且上述 XSLT 将不起作用。

如果是这种情况,您应该更改 XSLT 以考虑命名空间。 StackOverflow 上有很多关于如何在 XSLT 1.0 中处理默认命名空间的示例,但由于我感觉很圣诞节,请查看 http://xsltfiddle.liberty-development.net/nc4NzRw/1 的示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    相关资源
    最近更新 更多