3

XML データを出力する関数が 2 つあります。理想的には、各関数の出力を 1 つの変数に結合してデータを解析したいと考えています。

SQL 用語では、各関数は PageId 属性を介した内部結合によって結合できますが、結合は XSLT では許可されていません (少なくとも私の知る限りでは)。

これらの機能を組み合わせる最もクリーンで簡単な方法について何か提案はありますか? 私が呼び出している関数は cms に組み込まれており、編集することはできません。

いくつかの詳細情報:

最初の機能はサイトマップです。Web ページ ID とその Web サイトのレベルが一覧表示されます。

2 番目の関数は、サイト マップと組み合わせる必要がある Web ページ ID とそのメタデータ タグを取得します。

2 番目の機能のページ ID の変数を作成することを考えましたが、メタデータ タグを持つページの数が変化し、変数が動的な名前をサポートしているとは思えません。

xslt は初めてなので、説明が不十分でしたら申し訳ありません。さらに情報が必要な場合はお知らせください。

編集: コード例の追加

<in:inputs xmlns:in="http://www.composite.net/ns/transformation/input/1.0">
  <in:result name="SitemapXml">
    <Page Id="a0a47ce1-6eba-4d29-a7a3-3749c768c7e7" isopen="true" xmlns="">
      <Page Id="a3055286-0e90-4b04-99dd-fb1a61dde0bf" isopen='true' xmlns="">
        <Page Id="da675b13-d4d3-42ab-acc1-82e2a5408100" isopen='true' iscurrent='true' Depth="2"/>
      </Page>
    </Page>
  </in:result>
  <in:result name="GetisrootXml">
    <isroot PageId="a0a47ce1-6eba-4d29-a7a3-3749c768c7e7" Id="f8d4eea4-7070-4bc3-a804-e106697ffaa9" isroot="true" xmlns=""/>
    <isroot PageId="f8e4adbc-2758-42d6-bc40-0192ba0107a6" Id="db62e132-3f3b-493f-917a-9e090f887f13" isroot="false" xmlns=""/>
  </in:result>
</in:inputs>

私が返したいもの:

<in:inputs xmlns:in="http://www.composite.net/ns/transformation/input/1.0">
  <in:result name="SitemapXml">
    <Page Id="a0a47ce1-6eba-4d29-a7a3-3749c768c7e7" isopen="true" xmlns="" isroot='true'>
    </Page>
    <Page Id="a3055286-0e90-4b04-99dd-fb1a61dde0bf" isopen='true' xmlns="">
        <Page Id="da675b13-d4d3-42ab-acc1-82e2a5408100" isopen='true' iscurrent='true' Depth="2"/>
  </in:result>
</in:inputs>

これから、ニーズに合わせて出力をさらに変更したいと思います (表示目的でタグを追加します)。そのポイントに到達するには、isroot 属性をサイトマップに添付する必要があります。

4

2 に答える 2

2

この変換:

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

 <xsl:key name="kIsRootByPageId" match="isroot" use="@PageId"/>

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

 <xsl:template match="in:result[1]/Page">
  <xsl:copy>
   <xsl:apply-templates select="@*"/>
   <xsl:copy-of select="key('kIsRootByPageId',@Id )/@isroot"/>
   <xsl:apply-templates select="node()"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="in:result[2]"/>
</xsl:stylesheet>

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

<in:inputs xmlns:in="http://www.composite.net/ns/transformation/input/1.0">
    <in:result name="SitemapXml">
        <Page Id="a0a47ce1-6eba-4d29-a7a3-3749c768c7e7" isopen="true" xmlns=""></Page>
        <Page Id="a3055286-0e90-4b04-99dd-fb1a61dde0bf" isopen='true' xmlns="">
            <Page Id="da675b13-d4d3-42ab-acc1-82e2a5408100" isopen='true' iscurrent='true' Depth="2"/></Page>
    </in:result>
    <in:result name="GetisrootXml">
        <isroot PageId="a0a47ce1-6eba-4d29-a7a3-3749c768c7e7" Id="f8d4eea4-7070-4bc3-a804-e106697ffaa9" isroot="true" xmlns=""/>
        <isroot PageId="f8e4adbc-2758-42d6-bc40-0192ba0107a6" Id="db62e132-3f3b-493f-917a-9e090f887f13" isroot="false" xmlns=""/>
    </in:result>
</in:inputs>

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

<in:inputs xmlns:in="http://www.composite.net/ns/transformation/input/1.0">
   <in:result name="SitemapXml">
      <Page Id="a0a47ce1-6eba-4d29-a7a3-3749c768c7e7" isopen="true" isroot="true"/>
      <Page Id="a3055286-0e90-4b04-99dd-fb1a61dde0bf" isopen="true">
         <Page Id="da675b13-d4d3-42ab-acc1-82e2a5408100" isopen="true" iscurrent="true"
               Depth="2"/>
      </Page>
   </in:result>
</in:inputs>

説明:

  1. アイデンティティ ルールは、このテンプレートが実行のために選択されたすべてのノードを「そのまま」コピーします。

  2. オーバーライドするテンプレートが 2 つあります。2 番目のテンプレートは、2 番目に出現しin:resultた .

  3. 最初のオーバーライド テンプレートPageは、最初に出現した の子であるすべてのテンプレートと一致しますin:result。キーを使用して、その属性isrootで current を参照する要素を効率的かつ便利に見つけ、その属性をコピーします。PagePageIdisroot

于 2012-07-09T12:33:26.940 に答える
1

私が SQL を怒って使ってから何年も経っているので、SQL 用語で表現されたソリューションの説明から要件を再構築することは困難です。また、XSLT は、表形式のデータ モデルではなく階層型のデータ モデルを使用するため、SQL とは異なります。つまり、「内部結合」などの用語は直接マップされません。ただし、XSLT で結合 (内部と外部の両方) を実行することは確かに可能です。通常は、入れ子になったループであるかのように記述します。

あなたの質問に対する詳細な回答は、XSLT 1.0 と 2.0 のどちらを使用しているか、および構成する関数が XML とアトミック値のどちらを配信しているかによって異なります。具体的な入力と出力の例を示して具体的な質問をすると、具体的な答えを出すことができるため、より効果的です。

于 2012-07-09T07:35:26.220 に答える