0

xsltを介して適切な変換を行うための適切なXpathを取得するのに役立つ人はいますか??

以下に示すように、 xpathを介してxsltを使用してinput.xmlを変換し(document(input.xml)//track)、希望の出力を取得しようとしています。

入力 xml:以下に示すように

    <mergingTracksBreakdownStructure>
    <track id="10">
      <mergedTrack id="10"/>
      <mergedTrack id="11"/>
      <mergedTrack id="12"/>
       <track id="13">
         <mergedTrack id="13"/>
         <mergedTrack id="14"/>
           <track id="15">
              <mergedTrack id="15"/>
               <mergedTrack id="16"/>
            </track>
        </track>
    </track>
    <track id="27">
      <mergedTrack id="27"/>
    </track>
    <track id="30">
    <mergedTrack id="30"/>
    </track>
    </mergingTracksBreakdownStructure>

出力 xml が必要:以下に示すように


    <mergingTracksBreakdownStructure>
     <track id="10">
       <mergedTrack id="10"/>
       <mergedTrack id="11"/>
       <mergedTrack id="12"/>
    </track>
    <track id="13">
      <mergedTrack id="13"/>
      <mergedTrack id="14"/>
    </track>
    <track id="15">
      <mergedTrack id="15"/>
      <mergedTrack id="16"/>
    </track>
    <track id="27">
      <mergedTrack id="27"/>
    </track>
    <track id="30">
      <mergedTrack id="30"/>
    </track>
    </mergingTracksBreakdownStructure>

変換に使用される XSLT:

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

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

    <xsl:template match="/">
        <xsl:result-document href="output.xml" method="xml">
        <xsl:apply-templates select="document('input.xml')//track"/>
        </xsl:result-document>
    </xsl:template>

</xsl:stylesheet>
4

1 に答える 1

0

要求された出力は、次のスタイルシートを入力 XML に適用することで非常に簡単に実現できます。

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

<xsl:template match="/mergingTracksBreakdownStructure">
    <xsl:copy>
        <xsl:apply-templates select="track"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="track">
    <xsl:copy>
        <xsl:copy-of select="@* | mergedTrack"/>
    </xsl:copy>
    <xsl:apply-templates select="track"/>
</xsl:template>

</xsl:stylesheet>
于 2020-06-05T16:23:05.530 に答える