【问题标题】:Sorting XML Elements and sorting data for a set of elements with XSLT使用 XSLT 对 XML 元素进行排序并为一组元素排序数据
【发布时间】:2012-10-01 07:57:19
【问题描述】:

我有以下示例 xml 数据。我需要在多个级别对元素和数据进行排序。 1. 排序必须发生在像<InventoryRecord><SalesInRecord><SellOutRecord>这样的根级别之下 2. 必须对字段名称上的每个 <InventoryRecord><SalesInRecord><SellOutRecord> 中的所有元素进行排序 3. 无论记录集类型如何,都必须对每个记录集中<LOCATION_ID><LOCATION_ID_DB><LOCATION_NAME> 字段中的数据进行排序。 这里重要的是,对于某些记录,<LOCATION_ID> 元素可能不可用。 在这种情况下,排序应该只发生在 <LOCATION_ID_DB><LOCATION_NAME> 值上。

<root>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <RECORD_TYPE>VALID</RECORD_TYPE>
    <RECORD_NO>1</RECORD_NO>
    <LOCATION_ID>2-3LG-2456</LOCATION_ID>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <LOCATION_ID_DB>2-3LG-2456</LOCATION_ID_DB>
</SellOutRecord>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
    <RECORD_NO>2</RECORD_NO>
    <LOCATION_NAME>XYZ ABC</LOCATION_NAME>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
</SellOutRecord>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <RECORD_TYPE>WARNING</RECORD_TYPE>
    <RECORD_NO>3</RECORD_NO>
    <LOCATION_ID>2-3LG-2450</LOCATION_ID>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
</SellOutRecord>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
    <RECORD_NO>4</RECORD_NO>
    <LOCATION_ID>2-3LG-2456</LOCATION_ID>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <LOCATION_ID_DB>2-3LG-2456</LOCATION_ID_DB>
</SellOutRecord>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
    <RECORD_NO>6</RECORD_NO>
    <LOCATION_NAME>XYZ ABC</LOCATION_NAME>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
</SellOutRecord>
<InventoryRecord>
    <FILE_TYPE>STOIV</FILE_TYPE>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
    <RECORD_NO>2</RECORD_NO>
    <LOCATION_ID>2-3LG-2450</LOCATION_ID>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
</InventoryRecord>
<InventoryRecord>
    <FILE_TYPE>STOIV</FILE_TYPE>
    <RECORD_TYPE>VALID</RECORD_TYPE>
    <RECORD_NO>4</RECORD_NO>
    <LOCATION_ID>2-3LG-2456</LOCATION_ID>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <LOCATION_ID_DB>2-3LG-2456</LOCATION_ID_DB>
</InventoryRecord>
<InventoryRecord>
    <FILE_TYPE>STOIV</FILE_TYPE>
    <RECORD_TYPE>VALID</RECORD_TYPE>
    <RECORD_NO>5</RECORD_NO>
    <LOCATION_NAME>XYZ ABC</LOCATION_NAME>>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
</InventoryRecord>
<InventoryRecord>
    <FILE_TYPE>STOIV</FILE_TYPE>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
    <RECORD_NO>8</RECORD_NO>
    <LOCATION_ID>2-3LG-2456</LOCATION_ID>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <LOCATION_ID_DB>2-3LG-2456</LOCATION_ID_DB>
</InventoryRecord>
<SalesInRecord>
    <FILE_TYPE>STOSI</FILE_TYPE>
    <RECORD_TYPE>VALID</RECORD_TYPE>
    <RECORD_NO>3</RECORD_NO>
    <LOCATION_ID>2-3LG-2456</LOCATION_ID>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <LOCATION_ID_DB>2-3LG-2456</LOCATION_ID_DB>
</SalesInRecord>
<SalesInRecord>
    <FILE_TYPE>STOSI</FILE_TYPE>
    <RECORD_TYPE>WARNING</RECORD_TYPE>
    <RECORD_NO>3</RECORD_NO>
    <LOCATION_ID>2-3LG-2456</LOCATION_ID>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <LOCATION_ID_DB>2-3LG-2456</LOCATION_ID_DB>
</SalesInRecord>
<SalesInRecord>
    <FILE_TYPE>STOSI</FILE_TYPE>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
    <RECORD_NO>4</RECORD_NO>
    <LOCATION_ID>2-3LG-2450</LOCATION_ID>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
</SalesInRecord>
<SalesInRecord>
    <FILE_TYPE>STOSI</FILE_TYPE>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
    <RECORD_NO>7</RECORD_NO>
    <LOCATION_NAME>XYZ ABC</LOCATION_NAME>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
</SalesInRecord>
</root>

预期的输出是。

<root>
<InventoryRecord>
    <FILE_TYPE>STOIV</FILE_TYPE>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
    <LOCATION_NAME>XYZ ABC</LOCATION_NAME>
    <RECORD_NO>5</RECORD_NO>
    <RECORD_TYPE>VALID</RECORD_TYPE>
</InventoryRecord>
<InventoryRecord>
    <FILE_TYPE>STOIV</FILE_TYPE>
    <LOCATION_ID>2-3LG-2450</LOCATION_ID>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <RECORD_NO>2</RECORD_NO>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
</InventoryRecord>
<InventoryRecord>
    <FILE_TYPE>STOIV</FILE_TYPE>
    <LOCATION_ID>2-3LG-2456</LOCATION_ID>
    <LOCATION_ID_DB>2-3LG-2456</LOCATION_ID_DB>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <RECORD_NO>4</RECORD_NO>
    <RECORD_TYPE>VALID</RECORD_TYPE>
</InventoryRecord>
<InventoryRecord>
    <FILE_TYPE>STOIV</FILE_TYPE>
    <LOCATION_ID>2-3LG-2456</LOCATION_ID>
    <LOCATION_ID_DB>2-3LG-2456</LOCATION_ID_DB>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <RECORD_NO>8</RECORD_NO>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
</InventoryRecord>
<SalesInRecord>
    <FILE_TYPE>STOSI</FILE_TYPE>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
    <LOCATION_NAME>XYZ ABC</LOCATION_NAME>
    <RECORD_NO>7</RECORD_NO>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
</SalesInRecord>
<SalesInRecord>
    <FILE_TYPE>STOSI</FILE_TYPE>
    <LOCATION_ID>2-3LG-2450</LOCATION_ID>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <RECORD_NO>4</RECORD_NO>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
</SalesInRecord>
<SalesInRecord>
    <FILE_TYPE>STOSI</FILE_TYPE>
    <LOCATION_ID>2-3LG-2456</LOCATION_ID>
    <LOCATION_ID_DB>2-3LG-2456</LOCATION_ID_DB>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <RECORD_NO>3</RECORD_NO>
    <RECORD_TYPE>VALID</RECORD_TYPE>
</SalesInRecord>
<SalesInRecord>
    <FILE_TYPE>STOSI</FILE_TYPE>
    <LOCATION_ID>2-3LG-2456</LOCATION_ID>
    <LOCATION_ID_DB>2-3LG-2456</LOCATION_ID_DB>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <RECORD_NO>3</RECORD_NO>
    <RECORD_TYPE>WARNING</RECORD_TYPE>
</SalesInRecord>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
    <LOCATION_NAME>XYZ ABC</LOCATION_NAME>
    <RECORD_NO>2</RECORD_NO>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
</SellOutRecord>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
    <LOCATION_NAME>XYZ ABC</LOCATION_NAME>
    <RECORD_NO>6</RECORD_NO>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
</SellOutRecord>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <LOCATION_ID>2-3LG-2450</LOCATION_ID>
    <LOCATION_ID_DB>-1</LOCATION_ID_DB>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <RECORD_NO>3</RECORD_NO>
    <RECORD_TYPE>WARNING</RECORD_TYPE>
</SellOutRecord>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <LOCATION_ID>2-3LG-2456</LOCATION_ID>
    <LOCATION_ID_DB>2-3LG-2456</LOCATION_ID_DB>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <RECORD_NO>1</RECORD_NO>
    <RECORD_TYPE>VALID</RECORD_TYPE>
</SellOutRecord>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <LOCATION_ID>2-3LG-2456</LOCATION_ID>
    <LOCATION_ID_DB>2-3LG-2456</LOCATION_ID_DB>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    <RECORD_NO>4</RECORD_NO>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
</SellOutRecord>
</root>

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    <xsl:stylesheet
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      version="1.0">
    
    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes"/>
    
    <xsl:template match="@* | node()">
      <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
      </xsl:copy>
    </xsl:template>
    
    <xsl:template match="root">
      <xsl:copy>
        <xsl:apply-templates select="*">
          <xsl:sort select="local-name()"/>
          <xsl:sort select="LOCATION_ID"/>
          <xsl:sort select="LOCATION_ID_DB"/>
          <xsl:sort select="LOCATION_NAME"/>
        </xsl:apply-templates>
      </xsl:copy>
    </xsl:template>
    
    <xsl:template match="SalesInRecord | SellOutRecord | InventoryRecord">
      <xsl:copy>
        <xsl:apply-templates select="*">
          <xsl:sort select="local-name()"/>
        </xsl:apply-templates>
      </xsl:copy>
    </xsl:template>
    
    
    </xsl:stylesheet>
    

    做你想做的事?我认为它会为您发布的输入生成您发布的输出。

    【讨论】:

      猜你喜欢
      • 2019-05-08
      • 2011-12-31
      • 2010-10-09
      • 2021-08-12
      • 2016-03-02
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2010-10-22
      相关资源
      最近更新 更多