0

元の XML の場合、次のようなものがあります。

<Data>
  <Statistic>
    <Title>Total Values</Title>
    <Type>Type A</Type>
    <Key>Cases</Key>
    <Value>3</Value>
   </Statistic>
   <Statistic>
    <Title>PHYSICIAN DETAIL TOTAL</Title>
    <Type>Type A</Type>
    <Key>Percentage</Key>
    <Value>75.0%</Value>
   </Statistic>
   <Statistic>
    <Title>Total Values</Title>
    <Type>Type B</Type>
    <Key>Cases</Key>
    <Value>1</Value>
   </Statistic>
   <Statistic>
    <Title>Total Values</Title>
    <Type>Type B</Type>
    <Key>Percentage</Key>
    <Value>25.0%</Value>
   </Statistic>
</Data>

基本的に、各タイプには、「ケース」と「パーセンテージ」が 1 つだけ存在します。最終的な XML は次のようになります。

<Data>
  <Statistic>
    <Title>Total Values</Title>
    <Type>Type A</Type>
    <count>
      <Case>1</Case>
      <Percentage>75%</Percentage>
    </count>
  </Statistic>
  <Statistic>
    <Title>Total Values</Title>
    <Type>Type B</Type>
    <count>
       <Case>1</Case>
       <Percentage>25%</Percentage>
    </count>
  </Statistic>
</Data>

これを達成するための最良の方法は何ですか?XSLT グループ化?

4

2 に答える 2

0

OPは、統計ごとに正確に1つのケースの子があり、統計ごとに正確に1つのパーセンテージの子があると言っているようです。この場合、グループ化は必要なく、解決策は簡単になります。

**この XSLT 1.0 スタイルシート (XSLT 2.0 でも機能します)...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" />

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

<xsl:template match="Statistic[Key='Percentage']" />

<xsl:template match="Statistic">
  <xsl:copy>
     <xsl:apply-templates select="@*|node()[not(self::Key|self::Value)]"/>
     <count>
       <Case><xsl:value-of select="Value" /></Case>
       <Percentage><xsl:value-of select=
         "../Statistic[Type=current()/Type][Key='Percentage']/Value" />
       </Percentage>
     </count>   
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

...このドキュメントに適用すると...

<Data>
  <Statistic>
    <Title>Total Values</Title>
    <Type>Type A</Type>
    <Key>Cases</Key>
    <Value>3</Value>
   </Statistic>
   <Statistic>
    <Title>PHYSICIAN DETAIL TOTAL</Title>
    <Type>Type A</Type>
    <Key>Percentage</Key>
    <Value>75.0%</Value>
   </Statistic>
   <Statistic>
    <Title>Total Values</Title>
    <Type>Type B</Type>
    <Key>Cases</Key>
    <Value>1</Value>
   </Statistic>
   <Statistic>
    <Title>Total Values</Title>
    <Type>Type B</Type>
    <Key>Percentage</Key>
    <Value>25.0%</Value>
   </Statistic>
</Data>

...収量...

<Data>
  <Statistic>
    <Title>Total Values</Title>
    <Type>Type A</Type>
    <count>
      <Case>3</Case>
      <Percentage>75.0%</Percentage>
    </count>
  </Statistic>
  <Statistic>
    <Title>Total Values</Title>
    <Type>Type B</Type>
    <count>
      <Case>1</Case>
      <Percentage>25.0%</Percentage>
    </count>
  </Statistic>
</Data>
于 2012-10-23T05:41:55.737 に答える
0
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:output indent="yes"/>

    <xsl:key name="stat-key" match="/Data/Statistic" use="Type"/>

    <xsl:template match="/">
        <Data>
            <xsl:apply-templates select="/Data/Statistic[generate-id()=generate-id(key('stat-key',Type)[1])]">
                <xsl:sort select="Type"/>
            </xsl:apply-templates>
        </Data>
    </xsl:template>

    <xsl:template match="Statistic">
        <xsl:copy>
            <xsl:copy-of select="Title|Type"/>
            <count>
                <Case>
                    <xsl:value-of select="key('stat-key', Type)[Key='Cases']/Value"/>
                </Case>
                <Percentage>
                    <xsl:value-of select="key('stat-key', Type)[Key='Percentage']/Value"/>
                </Percentage>
            </count>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

各グループTitleの最初Statisticの を選択しTypeます。

出力

<?xml version="1.0" encoding="utf-8"?>
<Data>
   <Statistic>
      <Title>Total Values</Title>
      <Type>Type A</Type>
      <count>
         <Case>3</Case>
         <Percentage>75.0%</Percentage>
      </count>
   </Statistic>
   <Statistic>
      <Title>Total Values</Title>
      <Type>Type B</Type>
      <count>
         <Case>1</Case>
         <Percentage>25.0%</Percentage>
      </count>
   </Statistic>
</Data>
于 2012-10-22T23:05:40.193 に答える