0

私のXML構造は次のようなものです

<Client>
  <Document>
    <service class="ABC">
      <author name="x"/>
      <Details>
        ...
      </Details>
    </service>
   </Document>
   <Document>
     <service class="ABC">
       <author name="x"/>
       <Details>
         ...
       </Details>
     </service>
   </Document>
   <Document>
     <service class="ABC">
       <author name="x"/>
       <Details>
         ...
       </Details>
     </service>
   </Document>'
</Client>

私はそれが好きです

<Client>
  <Document>
    <service class="ABC">
      <author name="x"/>
       <Details>
         ...
       </Details>
    </service>
   </Document>
   <Document>
     <service class="ABC">
       <author name="x"/>
       <Details>
         ...
       </Details>
     </service>
   </Document>
   <Document>
     <service class="ABC">
       <author name="x"/>
       <Details>
         ...
       </Details>
     </service>
   </Document>'
   <component>
     <service class="ABC">
       <author name="x"/>
     </service>
   </component>'
</Client>

私のxslファイルには

<xsl:template match="//v3:Client">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
      <component>
        <service class="">
          <xsl:apply-templates select="//v3:Client/v3:Document/v3:service/v3:author"/>
        </service>
      </component>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="//v3:Client/v3:component/v3:service">
    <xsl:element name="service" namespace="urn:hl7-org:v3">
      <xsl:attribute name="class">
        <xsl:value-of select="//v3:Client/v3:Document/v3:service/@class"/>
      </xsl:attribute>
    </xsl:element>
  </xsl:template>

しかし、それは望ましい出力を与えていません。その与える出力のような

クライアント
  書類
    service class = "ABC"
      著者名="x"
      詳細
        ..。
      詳細
     サービス
    書類
   書類
    service class = "ABC"
      著者名="x"
      詳細
        ..。
      詳細
    サービス
  書類
  書類
    service class = "ABC"
      著者名="x"
      詳細
        ..。
      詳細
    サービス
  書類
  成分
    service class = ""
      著者名="x"
    サービス
    service class = ""
      著者名="x"
    サービス
    service class = ""
      著者名="x"
    サービス
  成分
クライアント

xslは初めてです。誰かがこの問題を解決するのを手伝ってくれませんか?

4

3 に答える 3

0

使用group-by機能:

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

  <xsl:template match="/Client">

    <xsl:copy-of select="Document" />

    <!-- Group nodes by attribute value, produce one <component>
         per each group -->
    <xsl:for-each-group select="Document" group-by="service/@class">
      <component>
        <xsl:copy-of select="./service" />
      </component>
    </xsl:for-each-group>

  </xsl:template>

</xsl:stylesheet>

上記のスタイルシートは、属性値<component>ごとに1つを生成します。Document class=""

于 2013-03-26T09:43:41.410 に答える
0

アクセスできない場合は、軸group-byの使用を検討できます。following-sibling::

言い換えれば、あなたはこのようなものを探しています:

<component>
   <xsl:apply-templates select="Document/service[@class != following-sibling::service/@class]" mode="component" />
</component>

<xsl:template match="service" mode="component">
     <service class="{@class}">
         <!-- etc. -->
     </service>
</xsl:template>
于 2013-03-26T10:18:19.763 に答える
0

コンポーネント要素に個別のサービス要素を出力する場合は、XSTL1.0でMuenchianGroupingと呼ばれる手法を使用する必要があります。class属性はサービスを一意に識別すると想定しているので、まず、次のようにサービスを検索するためのキーを定義します。

<xsl:key name="service" match="service" use="@class" />

次に、コンポーネント要素を作成するときに、個別のサービス要素を取得するために、そのようなすべての要素を確認しますが、指定されたクラス属性のキーで最初に出現する要素のみを選択します。

<xsl:apply-templates 
     select="Document/service[generate-id() = generate-id(key('service', @class)[1])]" 
     mode="component" />

サービス要素に一致するテンプレート内で、必要に応じて詳細を出力できます。サンプルでは、​​詳細ではなく、ここで作成者要素のみが必要なように見えます。

<xsl:template match="service" mode="component">
   <xsl:copy>
     <xsl:apply-templates select="author|@*"/>
   </xsl:copy>
</xsl:template>

モードの使用は、compenent要素を出力するときにのみこのテンプレートマッチングが必要なためです。

これが完全なXSLTです

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="service" match="service" use="@class" />

<xsl:template match="Client">
   <xsl:copy>
     <xsl:apply-templates select="node()|@*"/>
     <component>
        <xsl:apply-templates select="Document/service[generate-id() = generate-id(key('service', @class)[1])]" mode="component" />
     </component>
   </xsl:copy>
</xsl:template>

<xsl:template match="service" mode="component">
    <xsl:copy>
      <xsl:apply-templates select="author|@*"/>
    </xsl:copy>
</xsl:template>

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

サンプルXMLに適用すると、次のように出力されます。

<Client>
   <Document>
      <service class="ABC">
         <author name="x"/>
         <Details> ... </Details>
      </service>
   </Document>
   <Document>
      <service class="ABC">
         <author name="x"/>
         <Details> ... </Details>
      </service>
   </Document>
   <Document>
      <service class="ABC">
         <author name="x"/>
         <Details> ... </Details>
      </service>
   </Document>
   <component>
      <service class="ABC">
         <author name="x"/>
      </service>
   </component>
</Client>
于 2013-03-26T10:54:44.577 に答える