1

次のxmlおよびxslファイルで重複レコードを取得しています。リストアイテムの1セットだけを変換したい。可能であれば、xsl部分から何も削除しないようにしてください(追加するだけです)。

<?xml version="1.0" encoding="utf-8" ?>
<data>
  <listitems name="Select..." CtrId="Id2"/>
  <listitems name="Item A" CtrId="Id2"/>
  <listitems name="Item B" CtrId="Id2"/>
  <listitems name="Select..." CtrId="Id4"/>
  <listitems name="Item A" CtrId="Id4"/>
  <listitems name="Item B" CtrId="Id4"/>  
  <listitems name="Select..." CtrId="Id6"/>
  <listitems name="Item C" CtrId="Id6"/>
  <listitems name="Item D" CtrId="Id6"/>  
</data>

 

  <xsl:template match="data/listitems">
    <html>
      <head>
        <title>Untitled</title>
      </head>
      <body>
        <xsl:value-of select="@name"/>
      </body>
    </html>
  </xsl:template>

 

結果(不正な動作;重複)選択...アイテムAアイテムB選択...アイテムAアイテムB

望ましい動作(1セットのみ取得)選択...アイテムAアイテムB

4

2 に答える 2

1

これを行う比較的簡単な方法は次のとおりです。

<xsl:param name="useId" select="/data/listitems[1]/@CtrId" />

<xsl:template match="/">
  <html>
    <head>
      <title>Untitled</title>
    </head>
    <body>
      <xsl:apply-templates select="data/listitems[@CtrId = $useId]"/>
    </body>
  </html>
</xsl:template>

<xsl:template match="listitems">
  <xsl:value-of select="concat(@name, ' ')" />
</xsl:template>

既存のテンプレートは実際にはhtmlすべての要素の要素を配置listitemsします-おそらく1つだけが必要なようです。

上部の<xsl:param>宣言は、ファイル内の最初のCtrIdを選択し、それを使用します。select="'Id2'"これを(二重引用符内の一重引用符に注意して)リテラル値に変更するか、選択するIDを使用してパラメーターをスタイルシートに渡すことができます。

于 2012-08-02T13:38:45.550 に答える
1

この変換

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

  <xsl:template match="/*">
    <html>
      <head>
        <title>Untitled</title>
      </head>
      <body>
       <xsl:apply-templates select=
          "*[starts-with(@name,'Select')][1]"/>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="*[starts-with(@name,'Select')]">
    <xsl:apply-templates mode="inGroup" select=
    "(.|following-sibling::*
        [generate-id(following-sibling::*
                     [@name[starts-with(.,'Select')]][1]
                     )
        =
         generate-id(current()/following-sibling::*
                               [@name[starts-with(.,'Select')]][1])
        ]
     )/@name
    "/>
  </xsl:template>

  <xsl:template match="@name" mode="inGroup">
   <xsl:value-of select="concat(., ' ')"/>
  </xsl:template>
</xsl:stylesheet>

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

<data>
  <listitems name="Select..." CtrId="Id2"/>
  <listitems name="Item A" CtrId="Id2"/>
  <listitems name="Item B" CtrId="Id2"/>
  <listitems name="Select..." CtrId="Id4"/>
  <listitems name="Item A" CtrId="Id4"/>
  <listitems name="Item B" CtrId="Id4"/>
</data>

必要な正しい結果を生成します。

<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

      <title>Untitled</title>
   </head>
   <body>Select... Item A Item B </body>
</html>
于 2012-08-02T04:21:29.463 に答える