1

こんにちはこれはここに投稿された前の質問の適応です。

XSLT-名前IDが一致する最初の前のアイテムから要素値を検索します-条件を使用しますか?

以下のようなXMLがあります。

投稿の下部に理想的なxmlを生成するxsl変換を作成したいと思います。

提示されたXML内で、ファイルIDによって定義されたImageノードが複数回使用されている場合、後続の子の要素は存在しないことに注意してください。たとえば、ファイルIDが最初のイメージノードと同じである3番目のイメージノードには、子プロパティと後続の値が含まれていません。それらを再び追加したいと思います。

以下の現在のサンプルxslは基本的に機能していますが、スタイルシートに次のような条件付き評価を追加したいと思います。英語:「key」要素が存在しない場合は、最初に一致する「fileid」を見つけて使用します。それらの要素からの値。同じことが'string要素と'reel'要素にも当てはまります。(ファイルノード内にポップアップするその他のもの。

結果は、一致するファイルIDの最初のインスタンスに基づいて、空のファイルノードをすべての関連データで埋めます。

説明が不十分であるとお詫びします。

どんな助けでも大歓迎です。

XML:

<?xml version="1.0"?>
<xmeml>
<boxset>
<stream>
    <track>
        <image>
            <start>0</start>
            <end>90</end>
            <file id="abcde">
                <key>95</key>
                <string>1023</string>
                <time>
                    <reel>142</reel>
                </time>
            </file>
        </image>
        <image>
            <start>90</start>
            <end>120</end>
            <file id="bcdef">
                <key>55</key>
                <string>1023</string>
                <time>
                    <reel>64</reel>
                </time>
            </file>
        </image>
    </track>
    <track>
        <image>
            <start>120</start>
            <end>130</end>
            <file id="abcde"/>
        </image>
        <image>
            <start>130</start>
            <end>180</end>
            <file id="cdefg">
                <key>92</key>
                <string>1023</string>
                <time>
                    <reel>194</reel>
                </time>
            </file>
        </image>    
    </track>
</stream>
</boxset>
</xmeml>

XSLT:標準のID変換

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


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

</xsl:stylesheet>

XMLが埋められるとしたら、私が見たいように、次のようになります。

理想的なXML:

<?xml version="1.0"?>
<xmeml>
<boxset>
<stream>
    <track>
        <image>
            <start>0</start>
            <end>90</end>
            <file id="abcde">
                <key>95</key>
                <string>1023</string>
                <time>
                    <reel>142</reel>
                </time>
            </file>
        </image>
        <image>
            <start>90</start>
            <end>120</end>
            <file id="bcdef">
                <key>55</key>
                <string>1023</string>
                <time>
                    <reel>64</reel>
                </time>
            </file>
        </image>
    </track>
    <track>
        <image>
            <start>120</start>
            <end>130</end>
<!-- ideal data for repeated file "abcde" -->
            <file id="abcde">
                <key>95</key>
                <string>1023</string>
                <time>
                    <reel>142</reel>
                </time>
            </file>
<!-- end ideal repeated data -->
        </image>
        <image>
            <start>130</start>
            <end>180</end>
            <file id="cdefg">
                <key>92</key>
                <string>1023</string>
                <time>
                    <reel>194</reel>
                </time>
            </file>
        </image>    
    </track>
</stream>
</boxset>
</xmeml>
4

2 に答える 2

1

この変換:

<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:key name="kImageById" match="image" use="file/@id"/>

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

 <xsl:template match=
  "image[not(generate-id()
            =generate-id(key('kImageById',file/@id)[1])
            )]">
  <xsl:copy>
   <xsl:apply-templates select="@*|start|end"/>
   <xsl:apply-templates select=
   "key('kImageById',file/@id)[1]/*[not(self::start or self::end)]"/>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

提供された XML ドキュメントに適用した場合:

<xmeml>
    <boxset>
        <stream>
            <track>
                <image>
                    <start>0</start>
                    <end>90</end>
                    <file id="abcde">
                        <key>95</key>
                        <string>1023</string>
                        <time>
                            <reel>142</reel>
                        </time>
                    </file>
                </image>
                <image>
                    <start>90</start>
                    <end>120</end>
                    <file id="bcdef">
                        <key>55</key>
                        <string>1023</string>
                        <time>
                            <reel>64</reel>
                        </time>
                    </file>
                </image>
            </track>
            <track>
                <image>
                    <start>120</start>
                    <end>130</end>
                    <file id="abcde"/>
                </image>
                <image>
                    <start>130</start>
                    <end>180</end>
                    <file id="cdefg">
                        <key>92</key>
                        <string>1023</string>
                        <time>
                            <reel>194</reel>
                        </time>
                    </file>
                </image>
            </track>
        </stream>
    </boxset>
</xmeml>

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

<xmeml>
   <boxset>
      <stream>
         <track>
            <image>
               <start>0</start>
               <end>90</end>
               <file id="abcde">
                  <key>95</key>
                  <string>1023</string>
                  <time>
                     <reel>142</reel>
                  </time>
               </file>
            </image>
            <image>
               <start>90</start>
               <end>120</end>
               <file id="bcdef">
                  <key>55</key>
                  <string>1023</string>
                  <time>
                     <reel>64</reel>
                  </time>
               </file>
            </image>
         </track>
         <track>
            <image>
               <start>120</start>
               <end>130</end>
               <file id="abcde">
                  <key>95</key>
                  <string>1023</string>
                  <time>
                     <reel>142</reel>
                  </time>
               </file>
            </image>
            <image>
               <start>130</start>
               <end>180</end>
               <file id="cdefg">
                  <key>92</key>
                  <string>1023</string>
                  <time>
                     <reel>194</reel>
                  </time>
               </file>
            </image>
         </track>
      </stream>
   </boxset>
</xmeml>
于 2012-08-10T02:43:30.477 に答える
0

fileを気にせずに処理する方が簡単だと思いますimage

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:key name="file" match="file[*]" use="@id"/>

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

  <xsl:template match="file[not(*)]">
    <xsl:copy-of select="key('file', @id)" />
  </xsl:template>

</xsl:stylesheet>
于 2012-08-10T11:56:45.133 に答える