Сортировка XSL для XML - PullRequest
       4

Сортировка XSL для XML

0 голосов
/ 30 июня 2011

Пожалуйста, найдите входные и выходные XML-файлы.XML отсортирован по узлу «Код» (отсортирован по CodeValue).

ВХОД XML

<?xml version="1.0" encoding="UTF-8"?>
<Service>
    <Account>
        <AccountNumber>AB1234</AccountNumber>       
        <Code>
            <CodeType>ABC</CodeType>
            <CodeValue>3456</CodeValue>
        </Code>
        <Code>
            <CodeType>ZCR</CodeType>
            <CodeValue>1234</CodeValue>
        </Code>
        <Bonus>
            <BonusDescription>INCR</BonusDescription>
            <BonusOfferNumber>1004</BonusOfferNumber>
        </Bonus>
        <Bonus>
            <BonusDescription>BNP</BonusDescription>
            <BonusOfferNumber>1326</BonusOfferNumber>
        </Bonus>
        <AccountOption>
            <AccountOptionNumber>1</AccountOptionNumber>
            <Supplier>
                <SupplierName>HSBC</SupplierName>
                <SupplierDetails>UK</SupplierDetails>
            </Supplier>
            <Supplier>
                <SupplierName>BARCLAYS</SupplierName>
                <SupplierDetails>US</SupplierDetails>
            </Supplier>
        </AccountOption>
    </Account>    
    <Account>
        <AccountNumber>AC7658</AccountNumber>       
        <Code>
            <CodeType>HGV</CodeType>
            <CodeValue>6780</CodeValue>
        </Code>
        <Code>
            <CodeType>MNR</CodeType>
            <CodeValue>67</CodeValue>
        </Code>
        <Bonus>
            <BonusDescription>BNP</BonusDescription>
            <BonusOfferNumber>5678</BonusOfferNumber>
        </Bonus>
        <Bonus>
            <BonusDescription>INCR</BonusDescription>
            <BonusOfferNumber>7804</BonusOfferNumber>
        </Bonus>
        <AccountOption>
            <AccountOptionNumber>9</AccountOptionNumber>
            <Supplier>
                <SupplierName>NAT</SupplierName>
                <SupplierDetails>US</SupplierDetails>
            </Supplier>
            <Supplier>
                <SupplierName>LKM</SupplierName>
                <SupplierDetails>GB</SupplierDetails>
            </Supplier>
        </AccountOption>
    </Account>    
</Service>

ВЫХОД XML:

<?xml version="1.0" encoding="UTF-8"?>
<Service>
    <Account>
        <AccountNumber>AB1234</AccountNumber>       
        <Code>
            <CodeType>ZCR</CodeType>
            <CodeValue>1234</CodeValue>
        </Code>
        <Code>
            <CodeType>ABC</CodeType>
            <CodeValue>3456</CodeValue>
        </Code>
        <Bonus>
            <BonusDescription>INCR</BonusDescription>
            <BonusOfferNumber>1004</BonusOfferNumber>
        </Bonus>
        <Bonus>
            <BonusDescription>BNP</BonusDescription>
            <BonusOfferNumber>1326</BonusOfferNumber>
        </Bonus>
        <AccountOption>
            <AccountOptionNumber>1</AccountOptionNumber>
            <Supplier>
                <SupplierName>HSBC</SupplierName>
                <SupplierDetails>UK</SupplierDetails>
            </Supplier>
            <Supplier>
                <SupplierName>BARCLAYS</SupplierName>
                <SupplierDetails>US</SupplierDetails>
            </Supplier>
        </AccountOption>
    </Account>    
    <Account>
        <AccountNumber>AC7658</AccountNumber>       
        <Code>
            <CodeType>MNR</CodeType>
            <CodeValue>67</CodeValue>
        </Code>
        <Code>
            <CodeType>HGV</CodeType>
            <CodeValue>6780</CodeValue>
        </Code>
        <Bonus>
            <BonusDescription>BNP</BonusDescription>
            <BonusOfferNumber>5678</BonusOfferNumber>
        </Bonus>
        <Bonus>
            <BonusDescription>INCR</BonusDescription>
            <BonusOfferNumber>7804</BonusOfferNumber>
        </Bonus>
        <AccountOption>
            <AccountOptionNumber>9</AccountOptionNumber>
            <Supplier>
                <SupplierName>NAT</SupplierName>
                <SupplierDetails>US</SupplierDetails>
            </Supplier>
            <Supplier>
                <SupplierName>LKM</SupplierName>
                <SupplierDetails>GB</SupplierDetails>
            </Supplier>
        </AccountOption>
    </Account>    
</Service>

Ответы [ 2 ]

1 голос
/ 30 июня 2011

Я мог бы описать <xsl:sort> в деталях, но w3schools может сделать это лучше, чем я:

http://www.w3schools.com/xsl/el_sort.asp

Вы можете определить шаблон для сортировки любого узла по его значению с небольшим изменением шаблона идентификации:

<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()">
          <xsl:sort />
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

Исходя из ваших комментариев, я считаю, что вам нужно что-то вроде этого:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:param name="sort" />

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:choose>
        <xsl:when test="name() = $sort">
          <xsl:apply-templates select="@* | node()">
            <xsl:sort />
          </xsl:apply-templates>
        </xsl:when>
        <xsl:otherwise>
          <xsl:apply-templates select="@* | node()" />
        </xsl:otherwise>
      </xsl:choose>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
0 голосов
/ 30 июня 2011

Поскольку вы не указали, как должны сортироваться данные, трудно дать точный ответ.

Элемент xsl:sort можно использовать для сортировки списков, как в случае выбора for-each внеэлегичный пример ниже.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
  <xsl:for-each select="//Account">
      <xsl:for-each select="Code">
        <xsl:sort select="CodeValue" data-type="number"/>
        <xsl:copy-of select="."></xsl:copy-of>    
      </xsl:for-each>
      <xsl:for-each select="Bonus">
        <xsl:sort select="BonusOfferNumber" data-type="number"/>
        <xsl:copy-of select="."></xsl:copy-of>    
      </xsl:for-each>
      <xsl:for-each select="AccountOption">
        <xsl:sort select="AccountOptionNumber" data-type="number"/>
        <xsl:copy-of select="AccountOptionNumber"/>
        <xsl:for-each select="Supplier">
            <xsl:sort select="SupplierName"/>
            <xsl:copy-of select="."></xsl:copy-of>    
        </xsl:for-each>
      </xsl:for-each>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

Обратите внимание, что Code отсортировано по номеру CodeValue, Bonus по номеру BonusOfferNumber и Supplier по алфавиту SupplierName.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...