2

この入力ファイルがある場合:

<root> 
    <node id="N1">
        <fruit id="small_fruit">
            <orange id="1" action="create">
                <attribute>
                    <color>yellow</color>
                </attribute>
            </orange>
        </fruit>

        <fruit id="large_fruit" action="create">
            <melon id="1" action="destroy">
                <attribute>
                    <color>green</color>
                </attribute>
            </melon>
        </fruit>            
    </node>

    <node id="N2">
        <dog id="small_dog">    
            <poodle id="1" action="create">
                <attribute>
                    <color>Yellow</color>    
                </attribute>
            </poodle>       

            <poodle id="1" action="change">
                <attribute>
                    <color>Brown</color>        
                </attribute>
            </poodle>

            <terrier id="2" action="destroy">
                <attribute>
                    <color>Blue</color>    
                </attribute>
            </terrier>
        </dog>                          
    </node>
</root>

そして私は2つのファイルに分ける必要があります: output1:node_destroy.xml

<root> 
    <node id="N1">          
        <fruit id="large_fruit" action="create">
            <melon id="1" action="destroy">
                <attribute>
                    <color>green</color>
                </attribute>
            </melon>
        </fruit>            
    </node>

    <node id="N2">
        <dog id="small_dog">                
            <terrier id="2" action="destroy">
                <attribute>
                    <color>Blue</color>    
                </attribute>
            </terrier>
        </dog>                          
    </node>
</root>

output2:node_other_than_destroy.xml

<root> 
    <node id="N1">
        <fruit id="small_fruit">
            <orange id="1" action="create">
                <attribute>
                    <color>yellow</color>
                </attribute>
            </orange>
        </fruit>                  
    </node>

    <node id="N2">
        <dog id="small_dog">    
            <poodle id="1" action="create">
                <attribute>
                    <color>Yellow</color>    
                </attribute>
            </poodle>       

            <poodle id="1" action="change">
                <attribute>
                    <color>Brown</color>        
                </attribute>
            </poodle>
        </dog>                          
    </node>
</root>

基本的に、action ='destroy'のノードを1つのファイルに削除し、他のアクションのノードを別のファイルに削除する必要があります。(チェックされたアクションノードはメロン、プードル、テリアであり、両親ではありません。つまり、果物と犬です

変換ファイルを手伝ってください。どうもありがとう。

よろしく、ジョン

4

2 に答える 2

2

どのXSLTプロセッサを使用していますか?それがSaxon9、AltovaXML、XmlPrimeなどのXSLT 2.0プロセッサである場合は、を使用できますxsl:result-document instruction。XSLT 1.0プロセッサでは、プロセッサが複数の結果ドキュメントを作成するための拡張命令をサポートしているかどうかを確認する必要があります。したがって、使用しているプロセッサを教えてください。そうすれば、入力サンプルと目的の出力サンプルの具体的なコードサンプルを提案できます。

[編集]XSLT2.0サンプルを用意しました。

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="xs"
  version="2.0">

  <xsl:param name="action" as="xs:string" select="'destroy'"/>

  <xsl:strip-space elements="*"/>
  <xsl:output indent="yes"/>

  <xsl:template match="/">
    <xsl:result-document href="node_{$action}.xml">
      <xsl:apply-templates/>
    </xsl:result-document>
    <xsl:result-document href="node_other_than_{$action}.xml">
      <xsl:apply-templates mode="other"/>
    </xsl:result-document>
  </xsl:template>

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

  <xsl:template match="/*/*[*/*[@action = $action]] 
                       | /*/*/*[*[@action = $action]]">
    <xsl:next-match/>
  </xsl:template>

  <xsl:template match="/*/*[not(*/*[@action = $action])] 
                       | /*/*/*[not(*[@action = $action])]
                       | /*/*/*/*[not(@action = $action)]"/>

  <xsl:template match="/*/*[*/*[not(@action = $action)]] 
                       | /*/*/*[*[not(@action = $action)]]" mode="other">
    <xsl:next-match/>
  </xsl:template>

  <xsl:template match="/*/*[not(*/*[not(@action = $action)])] 
                       | /*/*/*[not(*[not(@action = $action)])]
                       | /*/*/*/*[@action = $action]" mode="other"/>


</xsl:stylesheet>
于 2012-05-06T10:15:48.747 に答える
2

XSLT 1.0では、変換の1回の実行から複数​​の出力を作成する方法はありません

ここに2つの別々のXSLT1.0変換があります

最初のものは、次の結果のみを生成しaction="destroyます。

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

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

 <xsl:template match="node[not(*/*/@action = 'destroy')]"/>
 <xsl:template match="node/*[not(*/@action = 'destroy')]"/>

 <xsl:template match="node/*/*[not(@action = 'destroy')]"/>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントに適用される場合

<root>
    <node id="N1">
        <fruit id="small_fruit">
            <orange id="1" action="create">
                <attribute>
                    <color>yellow</color>
                </attribute>
            </orange>
        </fruit>

        <fruit id="large_fruit" action="create">
            <melon id="1" action="destroy">
                <attribute>
                    <color>green</color>
                </attribute>
            </melon>
        </fruit>
    </node>

    <node id="N2">
        <dog id="small_dog">
            <poodle id="1" action="create">
                <attribute>
                    <color>Yellow</color>
                </attribute>
            </poodle>

            <poodle id="1" action="change">
                <attribute>
                    <color>Brown</color>
                </attribute>
            </poodle>

            <terrier id="2" action="destroy">
                <attribute>
                    <color>Blue</color>
                </attribute>
            </terrier>
        </dog>
    </node>
</root>

必要な正しい結果が生成されます。

<root>
   <node id="N1">
      <fruit id="large_fruit" action="create">
         <melon id="1" action="destroy">
            <attribute>
               <color>green</color>
            </attribute>
         </melon>
      </fruit>
   </node>
   <node id="N2">
      <dog id="small_dog">
         <terrier id="2" action="destroy">
            <attribute>
               <color>Blue</color>
            </attribute>
         </terrier>
      </dog>
   </node>
</root>

2番目の変換では、すべての「非破壊」コンテンツが生成されます。

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

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

 <xsl:template match="node[not(*/*/@action[not(. = 'destroy')])]"/>
 <xsl:template match="node/*[not(*/@action[not(. = 'destroy')])]"/>

 <xsl:template match="node/*/*[@action = 'destroy']"/>
</xsl:stylesheet>

この変換が同じXMLドキュメント(上記)に適用されると、必要な結果が生成されます。

<root>
   <node id="N1">
      <fruit id="small_fruit">
         <orange id="1" action="create">
            <attribute>
               <color>yellow</color>
            </attribute>
         </orange>
      </fruit>
   </node>
   <node id="N2">
      <dog id="small_dog">
         <poodle id="1" action="create">
            <attribute>
               <color>Yellow</color>
            </attribute>
         </poodle>
         <poodle id="1" action="change">
            <attribute>
               <color>Brown</color>
            </attribute>
         </poodle>
      </dog>
   </node>
</root>

II。XSLT 2.0ソリューション-同じ変換内で両方の出力ファイルを作成します:

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

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

 <xsl:template match="/">
   <xsl:variable name="vResultDestroyed">
     <xsl:apply-templates mode="destroyed"/>
   </xsl:variable>
   <xsl:variable name="vResultNonDestroyed">
     <xsl:apply-templates mode="non-destroyed"/>
   </xsl:variable>

   <xsl:for-each select="1 to 2">
     <xsl:result-document
        href="file:///c:temp/delete/{'non-'[position()=current()]}destroyed.xml">
      <xsl:copy-of select=
       "($vResultNonDestroyed, $vResultDestroyed)[position() = current()]"/>
     </xsl:result-document>
   </xsl:for-each>
 </xsl:template>

 <xsl:template mode="destroyed" match="node[not(*/*/@action = 'destroy')]"/>
 <xsl:template mode="destroyed" match="node/*[not(*/@action = 'destroy')]"/>
 <xsl:template mode="destroyed" match="node/*/*[not(@action = 'destroy')]"/>

 <xsl:template mode="non-destroyed"  match="node[not(*/*/@action[not(. = 'destroy')])]"/>
 <xsl:template mode="non-destroyed"  match="node/*[not(*/@action[not(. = 'destroy')])]"/>
 <xsl:template mode="non-destroyed"  match="node/*/*[@action = 'destroy']"/>
</xsl:stylesheet>

この変換がSaxon9.1.07で実行されると、正しい出力がファイルに書き込まれます

C:\Program Files\Java\jre6\bin\temp\delete\destroyed.xml

C:\Program Files\Java\jre6\bin\temp\delete\non-destroyed.xml

于 2012-05-06T15:32:25.383 に答える