1

「親」サブ要素を使用して相互に参照するいくつかのXML要素を取得しました。すべてのトップレベル要素をコピーする必要があるわけではないので、コピーする必要がある(メイン)セクションのuniqueNamesの固定リストがあります。

XSLでサブセクションをコピーする必要があるメインセクションのリスト:

<xsl:variable name="mainSections">|news|sport|</xsl:variable>

ソースXMLメインセクション:

<section uniqueName="news">
</section>

<section uniqueName="sport">
</section>

<section uniqueName="travel">
</section>

ソースXMLサブセクション:

<section uniqueName="national_news">
  <parent uniqueName="news"/>
</section>

<section uniqueName="regional_news">
  <parent uniqueName="national_news"/>
</section>

<section uniqueName="city_news">
  <parent uniqueName="regional_news"/>
</section>

<section uniqueName="travel_europe">
  <parent uniqueName="travel"/>
</section>

<section uniqueName="holland">
  <parent uniqueName="travel_europe"/>
</section>

等。

サブセクションは、開発フェーズとXSLの作成の間で移動、変更、または削除される傾向があるため、特定のサブセクションがメインセクションの1つの子であるかどうかを動的に判断する必要があります。全部で無数のサブセクションもあります。コピーするサブセクションのリストをハードコーディングすることは元に戻せません。

例に示すように、サブセクションの深さは非常に深くなる可能性があります。セクション「city_news」の親として「regional_news」があり、親として「national_news」があり、親として「news」があるため、このセクションはコピーする必要があります。 「ニュース」の子。セクション「holland」のトップレベルセクション「Travel」(サブセクション「travel_europe」の下)はコピーするリストにないため、無視する必要があります。

最初は、親がリストに含まれているかどうかを各要素で確認しようとしましたが、それはばかげていたので、1レベルしか深くなりません。私の最後の試みは、最初にすべてのセクションにインデックスを付け、次に構造を分析して、リストにないメインセクションに関連するすべてのセクションを削除するJavaScriptを作成することでした。しかし、XSLにはjavascriptを呼び出す独自の手段がないため、スクリプトを呼び出すことも課題であることがわかりました。

私はこれをどのように進めるかについて少し無知です...何か解決策や提案はありますか?

ソースXMLドキュメントは3500行であり、そこにある情報はこの質問には関係ありません。問題は、メインセクションのサブセクションのサブセクションのサブセクションをどのように除外するか、またはサブセクションがツリーの数ステップ上の指定されたメインセクションの子であるかどうかをどのように判断するかです。上記の5つのサブセクションを入力すると、出力は次のようになります。

<section uniqueName="national_news">
  <parent uniqueName="news"/>
</section>

<section uniqueName="regional_news">
  <parent uniqueName="national_news"/>
</section>

<section uniqueName="city_news">
  <parent uniqueName="regional_news"/>
</section>

以来

<section uniqueName="travel_europe">
  <parent uniqueName="travel"/>
</section>

<section uniqueName="holland">
  <parent uniqueName="travel_europe"/>
</section>

コピーするリストにない「旅行」メインセクションに関連します。

4

1 に答える 1

0

この変換:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:param name="pWanted" select="'|news|sport|'"/>

 <xsl:key name="kChildren" match="section" use="parent/@uniqueName"/>

 <xsl:template match="/*">
     <xsl:call-template name="getSections">
       <xsl:with-param name="pParents" select=
       "section[contains($pWanted, concat('|',@uniqueName, '|'))]"/>
     </xsl:call-template>
 </xsl:template>

 <xsl:template name="getSections">
  <xsl:param name="pParents" select="/.."/>

  <xsl:if test="$pParents">
    <xsl:copy-of select="$pParents"/>
    <xsl:call-template name="getSections">
     <xsl:with-param name="pParents"
        select="key('kChildren', $pParents/@uniqueName)"/>
    </xsl:call-template>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

次の XML ドキュメントに適用した場合(そのようなものは提供されていません!!!):

<t>
    <section uniqueName="news"></section>
    <section uniqueName="sport"></section>
    <section uniqueName="travel"></section>
    <section uniqueName="national_news">
        <parent uniqueName="news"/>
    </section>
    <section uniqueName="regional_news">
        <parent uniqueName="national_news"/>
    </section>
    <section uniqueName="city_news">
        <parent uniqueName="regional_news"/>
    </section>
    <section uniqueName="travel_europe">
        <parent uniqueName="travel"/>
    </section>
    <section uniqueName="holland">
        <parent uniqueName="travel_europe"/>
    </section>
</t>

必要な(質問で正確に指定されていない!!!)、正しい結果が生成されます

<section uniqueName="news"/>
<section uniqueName="sport"/>
<section uniqueName="national_news">
   <parent uniqueName="news"/>
</section>
<section uniqueName="regional_news">
   <parent uniqueName="national_news"/>
</section>
<section uniqueName="city_news">
   <parent uniqueName="regional_news"/>
</section>

説明:

キーと再帰の適切な使用。

于 2012-08-13T13:08:00.847 に答える