【问题标题】:xslt transformation with resortingxslt 转换与诉诸
【发布时间】:2018-03-04 20:33:21
【问题描述】:

嘿嘿, 我正在写 xslt 1.0,我有这些输入

<Data>
 <Item>
   <ID>1</ID>
   <Stock_ID>S1</Stock_ID>
   <Stock_amount>5</Stock_amount>
 </Item>
 <Item>
   <ID>2</ID>
   <Stock_ID>S1</Stock_ID>
   <Stock_amount>2</Stock_amount>
 </Item>
 <Item>
   <ID>1</ID>
   <Stock_ID>S2</Stock_ID>
   <Stock_amount>2</Stock_amount>
 </Item>
</Data>

我需要按项目 ID 排序的输出,以及所有库存的数量。例如:

<Data>
  <Item>
    <ID>1<ID>
    <Stock_ID>S1
      <Amount>5</Amount>
    </Stock_ID>
    <Stock_ID>S2
      <Amount>2</Amount>
    </Stock_ID>
  </Item>
  <Item>
    <ID>2<ID>
    <Stock_ID>S1
      <Amount>5</Amount>
    </Stock_ID>
    <Stock_ID>S2
      <Amount/>
    </Stock_ID>
  </Item>
</Data>

你有什么想法吗? 谢谢。

【问题讨论】:

  • 目前还没有。我不知道如何对项目进行分组。

标签: xslt xml-parsing xslt-1.0


【解决方案1】:

要将具有相似属性/值的元素分组,您必须使用Muenchian Grouping。这是 XSLT-1.0 缺少的分组功能的一种解决方法,该功能随后在 XSLT-2.0 中引入。

应用于您的问题,XSLT 代码可能如下所示(我将这些行注释为解释 - 希望这会有所帮助):

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

  <!-- key used for Muenchian grouping -->
  <xsl:key name="ids" match="ID" use="text()" />

  <!-- Match the root element and use Muenchian grouping with the first for-each loop -->
  <xsl:template match="/Data">
    <xsl:copy>                                                   <!-- copy Data element -->
      <xsl:for-each select="Item/ID[generate-id() = generate-id(key('ids',.)[1])]">   <!-- Muenchian Grouping magic -->
        <Item>
            <xsl:copy-of select="." />                           <!-- copy ID -->
            <xsl:for-each select="key('ids',.)">                 <!-- loop over similar ID elements -->
                <Stock_ID><xsl:value-of select="../Stock_ID" />  <!-- copy Stock_ID elements content --> 
                    <!-- copy Stock_amount content to new Amount element -->
                    <Amount><xsl:value-of select="../Stock_amount" /></Amount>        
                </Stock_ID>
            </xsl:for-each>
        </Item>
      </xsl:for-each>
    </xsl:copy>      
  </xsl:template>
</xsl:stylesheet>

输出:

<Data>
    <Item>
        <ID>1</ID>
        <Stock_ID>
            S1<Amount>5</Amount>
        </Stock_ID>
        <Stock_ID>
            S2<Amount>2</Amount>
        </Stock_ID>
    </Item>
    <Item>
        <ID>2</ID>
        <Stock_ID>
            S1<Amount>2</Amount>
        </Stock_ID>
    </Item>
</Data>

【讨论】:

  • 这正是我所需要的。现在我必须把它放在一个整体上。非常感谢。
猜你喜欢
  • 2012-06-07
  • 2019-10-23
  • 1970-01-01
  • 2010-11-06
  • 2021-11-18
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多