2012-04-17 9 views
0

XSLTに少し慣れているので、基本的な質問をお詫び申し上げます。XSL:ノード値を別のノードと比較する

XML(下)の3番目の<cell>(つまり、CODE1、CODE2)の値を各ノードから引き出してドロップダウンボックスに配置するXSLスタイルシートを作成しようとしています。私はまた、各ノードを比較し、反復的なものを取って、CODE1、CODE1、CODE2ではなくCODE1とCODE2のインスタンスを1つだけ表示するようにします。

XML:

<dvm> 
    <description>This is a description</description> 
    <columns> 
    <column name="lang"/> 
    <column name="text"/> 
    <column name="code" qualifier="true" order="1"/> 
    <column name="comm" qualifier="true" order="2"/> 
    <column name="subj"/> 
    <column name="copy"/> 
    <column name="flag"/> 
</columns> 
<rows> 
    <row> 
    <cell>English</cell> 
    <cell></cell> 
    <cell>CODE1</cell> 
    <cell>Fixed</cell> 
    <cell>Title1</cell> 
    <cell/><cell/> 
    <cell/><cell/> 
    </row> 
    <row> 
    <cell>English</cell> 
    <cell></cell> 
    <cell>CODE1</cell> 
    <cell>Wired</cell> 
    <cell>Title2</cell> 
    <cell/><cell/> 
    <cell/><cell/> 
    </row> 
    <row> 
    <cell>English</cell> 
    <cell></cell> 
    <cell>CODE2</cell> 
    <cell>Fixed</cell> 
    <cell>Title3</cell> 
    <cell/><cell/> 
    <cell/><cell/> 
    </row> 
</dvm> 

答えて

0

あなたがXSLT 2.0を適用することができ、その後、次のコマンドを使用します。

<xsl:value-of select="distinct-values(dvm/rows/row/cell[3])"/> 

XSLT 1.0では、マイケル・ケイで述べたようにMuenchianグループ化を使用します。デモ:次のような結果につながる

<?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" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:key name="Cells" match="dvm/rows/row/cell[3]" use="."/> 
    <xsl:template match="/"> 
     <root> 
      <w> 
       <xsl:for-each select="dvm/rows/row/cell[3]"> 
        <item> 
         <xsl:value-of select="."/> 
        </item> 
       </xsl:for-each> 
      </w> 
      <z> 
       <xsl:for-each select="dvm/rows/row/cell[3]"> 
        <xsl:if test="generate-id() = generate-id(key('Cells', .)[1])"> 
         <item> 
          <xsl:value-of select="."/> 
         </item> 
        </xsl:if> 
       </xsl:for-each> 
      </z> 
     </root> 
    </xsl:template> 
</xsl:stylesheet> 

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <w> 
     <item>CODE1</item> 
     <item>CODE1</item> 
     <item>CODE2</item> 
    </w> 
    <z> 
     <item>CODE1</item> 
     <item>CODE2</item> 
    </z> 
</root> 

説明:
xsl:keymatch/use値から構成されたノードの各発生にキー値を代入 - あなたが集中することを望むcell[3]値に。これら全てのcell[3]値を介して、ループ、値が同じキーを持つノードのセット内の最初の要素のIDと同じ固有ID(各ノードがgenerate-id()関数を適用することによってアクセスすることができる固有のIDを持っている)を有しているかどうかをチェック値(このセットはkey()関数を使用して選択されます)。効果的には、処理されたノードが、現在のノード値にキー値として適用されたときにCellsキーで定義されたノードセット内の最初のノードと同じノードであるかどうかをチェックしています。それは除外された場合、等式をとにかくセットの最初の要素で確認されているのでgenerate-id(..node-set..)を自動的のみノード集合内の最初のノードのIDを生成するため
実際指数[1]は、不必要であるが、それはありますインデックスを追加するために少しきちんとしてください。
これは、CODE1セル[3]の値が1回だけ選択されることに注意してください。
本の実用的なアプリケーションは、(それゆえ、xsl:for-each等々)上記<z>要素と同等の内容でxsl:variableを定義することで<item>要素をループにその変数を使用して、リストでこれらを表示することができます約話していた。

2

重複を削除することは、一般に「グループ分け」と呼ばれる問題のクラスの特殊なケースです。 XSLT 2.0には、グループ化の問題、distinct-values()関数、xsl:for-each-group命令をサポートするための機能がいくつかあります。 XSLT 1.0では、それはより困難だ:「Muenchianグループ」を検索(または私はここでそれを説明するために持っているよりも多くの時間を持つ人を待つ...)

関連する問題