2016-05-04 10 views
2

私は個人1のためにそのような何かにXSLT 2.0XSL 2.0:

<data> 
    <attributes> 
    <attribute code="Name" datatyp="String" class="A"></attribute> 
    <attribute code="Age" datatyp="Integer" class="A"></attribute> 
    <attribute code="sex" datatyp="String" class="A"></attribute> 
    <attribute code="height" datatyp="Integer" class="B"></attribute> 
    </attributes> 
    <personal> 
    <name>Klaus</name> 
    <Age>16</Age> 
    <sex>male</sex> 
    <height>180</height> 
    </personal> 
    <personal> 
    <height>165</height> 
    </personal> 
</data> 

に属性がどのクラスに表示されて依存性がある

<personal> 
    <class> 
    <classtype>A</classtype> 
    <name>Klaus</name> 
    <Age>16</Age> 
    <sex>male</sex> 
    </class> 
    <class> 
    <classtype>B</classtype> 
    <height>180</height> 
    </class> 
</personal> 
<personal> 
    <class> 
    <classtype>B</classtype> 
    <height>165</height> 
    </class> 
</personal> 

を変換しようとする定義済みの属性に応じたテンプレートを呼び出します入力XMLの冒頭に定義されています。クラスAとBのテンプレートをPersonごとに1回だけ呼び出す必要があります。そのため、次のような試みは機能しません。

私は、指定されたパラメータに従って適切なテンプレートを呼び出す問題を解決するためにいくつかの助けが必要です。

+0

http://stackoverflow.com/help/someone-answers –

答えて

1

でしょうあなたのためにこの作品:

XSLT 2.0

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

<xsl:key name="attr-by-code" match="attribute" use="@code" /> 

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

<xsl:template match="personal"> 
    <xsl:copy> 
     <xsl:for-each-group select="*" group-by="key('attr-by-code', name())/@class"> 
      <class> 
       <classtype> 
        <xsl:value-of select="current-grouping-key()" /> 
       </classtype> 
       <xsl:apply-templates select="current-group()" /> 
      </class> 
     </xsl:for-each-group> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="attributes"/> 

</xsl:stylesheet> 
0

シンプル、二回短く、保存順よりも、実際に正しい:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 
<xsl:key name="kAttrByCode" match="attribute" use="@code"/> 

    <xsl:template match="personal"> 
    <xsl:copy> 
     <xsl:for-each-group select="*[key('kAttrByCode', name())]" 
          group-adjacent="key('kAttrByCode', name())/@class"> 
     <class> 
      <classtype><xsl:sequence select="current-grouping-key()"/></classtype> 
      <xsl:sequence select="current-group()"/> 
     </class> 
     </xsl:for-each-group> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

この提供されたXML文書に変換が適用されますcode="Name"code="name"に補正されることに注意してください - 他の場合の変換関数は、ケース無感覚を達成するために使用されなければならない):

<personal> 
    <class> 
     <classtype>A</classtype> 
     <name>Klaus</name> 
     <Age>16</Age> 
     <sex>male</sex> 
    </class> 
    <class> 
     <classtype>B</classtype> 
     <height>180</height> 
    </class> 
</personal> 
<personal> 
    <class> 
     <classtype>B</classtype> 
     <height>165</height> 
    </class> 
</personal> 

<data> 
    <attributes> 
     <attribute code="name" datatyp="String" class="A"></attribute> 
     <attribute code="Age" datatyp="Integer" class="A"></attribute> 
     <attribute code="sex" datatyp="String" class="A"></attribute> 
     <attribute code="height" datatyp="Integer" class="B"></attribute> 
    </attributes> 
    <personal> 
     <name>Klaus</name> 
     <Age>16</Age> 
     <sex>male</sex> 
     <height>180</height> 
    </personal> 
    <personal> 
     <height>165</height> 
    </personal> 
</data> 

希望、正しい結果がが生成されます説明

  1. 使用して属性と<xsl:for-each-group>命令group-adjacent

  2. 標準XSLT関数を使用current-group()current-grouping-key()

+0

ここで生成された結果がよくありません形成されたXML(単一のルート要素を持たない)。 - そして、同じクラスのプロパティがソースXMLに隣接していることを示唆する質問は何も表示されません。順序が名前、年齢、身長、性別の場合は、2つのAグループが作成されます。 –

+0

@ michael.hor257k、XSLT変換の結果が整形式のXML文書である必要はありません。 ''の 'method'属性を" xml "に設定(またはデフォルト設定)すると、XSLTプロセッサは整形式のXMLフラグメント*を生成する必要があります。*整形式のXMLドキュメントではありません:http://www.w3 .org/TR/xslt#section-XML-Output-Methodを参照してください。そしてOPの必要な出力は完全にXMLドキュメントではありません。 1つまたは複数のグループを作成するかどうかは、OPによって指定されていません。私の個人的な選択は、注文を最大限に保存することです。 –