1

現在、XML ファイルの特定の要素を取得し、選択した要素の祖先をたどることによって、XML ファイルを複数の出力 XML ファイルに変換しようとしています。

例えば:

ソース XML:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <level_a> 
    <level_b> 
      <level_c> 
        <level_d> 
          <level_e/> 
        </level_d> 
      </level_c> 
    </level_b> 
    <level_b> 
      <level_c> 
        <level_d> 
          <level_e/> 
        </level_d> 
      </level_c> 
    </level_b> 
    <level_b> 
      <level_c> 
        <level_d> 
          <level_e/> 
          <level_e/> 
          <level_e/> 
        </level_d> 
      </level_c> 
    </level_b> 
    <level_b> 
      <level_c> 
        <level_d> 
          <level_d> 
            <level_e/> 
          </level_d> 
        </level_d> 
      </level_c> 
    </level_b>
  </level_a>
</root>

出力 XML ファイル:

1:

 <output>
        <output level="b"> 
          <output level="c"> 
            <output level="d"> 
              <output level="e"/> 
            </output> 
          </output> 
        </output> 
 </output>

2:

 <output>
        <output level="b"> 
          <output level="c"> 
            <output level="d"> 
              <output level="e"/> 
            </output> 
          </output> 
        </output> 
 </output>

3:

 <output>
        <output level="b"> 
          <output level="c"> 
            <output level="d"> 
              <output level="e"/>
              <output level="e"/> 
              <output level="e"/>  
            </output> 
          </output> 
        </output> 
 </output>

4:

 <output>
      <output level="b"> 
        <output level="c"> 
          <output level="d"> 
            <output level="d"> 
              <output level="e"/> 
            </output> 
          </output> 
        </output> 
      </output>
 </output>

次の XPath を使用して、シーケンスを生成する行で何かを実行できることを知っています。

(//level_d[not(level_d)])[last()]/ancestor::*[self::level_c|self::level_b]

それを foreach で繰り返すと、ドキュメントの順序で結果が得られます。

しかし、私が本当に興味を持っているのは、 foreach を使用せずに同じことを達成する方法です。私が考えることができる解決策は、すべての要素を逆に返すことです...

どんなヒントでも大歓迎です

よろしく
Vlax

4

2 に答える 2

0

可変ソリューションとして、level_a または level_d が変更された場合は、ここで値を調整できます。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="//level_d[not(ancestor::level_d)]">
            <xsl:result-document href="{concat('file_', count(preceding::*[self::level_d])+1,'.xml')}">
                <output>
                    <xsl:apply-templates select="ancestor-or-self::node()[parent::level_a]" mode="output"></xsl:apply-templates>
                </output>
            </xsl:result-document>
    </xsl:template>

    <xsl:template match="*" mode="output">
        <output level="{substring-after(local-name(),'level_')}">
            <xsl:apply-templates mode="output"/>
        </output>
    </xsl:template>
</xsl:stylesheet>

期待どおりの結果が得られます。

于 2013-06-04T23:56:32.050 に答える