1

次の XML があるとします。

<element1 title="title1">
<element2 title="title2">
<element3 title="title1">

ここでは、 と の属性 title が重複しelement1ていelement3ます。重複するすべての要素を見つけて、値を要素の名前にtitle置き換えたいと思います。titleしたがって、上記の例は次のようになります。

<element1 title="element1">
<element2 title="title2">
<element3 title="element3">

XSLT 1.0 でどのように行うことができますか?

4

1 に答える 1

1

I.この変換

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

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

 <xsl:template match=
  "@title[. = ../preceding::*/@title
         or
          . = ../following::*/@title
          ]">
  <xsl:attribute name="title"><xsl:value-of select="name(..)"/></xsl:attribute>
 </xsl:template>
</xsl:stylesheet>

次のXMLドキュメントに適用した場合:

<t>
    <element1 title="title1"/>
    <element2 title="title2"/>
    <element3 title="title1"/>
</t>

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

<t>
   <element1 title="element1"/>
   <element2 title="title2"/>
   <element3 title="element3"/>
</t>

II。キーを使用したおそらくより効率的なソリューション:

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

 <xsl:key name="kTitleVyVal" match="@title" use="."/>

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

 <xsl:template match=
  "@title[key('kTitleVyVal', .)[2]]">
  <xsl:attribute name="title"><xsl:value-of select="name(..)"/></xsl:attribute>
 </xsl:template>
</xsl:stylesheet>
于 2012-07-25T12:56:53.783 に答える