2

今日もひとつ問題にぶつかりました。book という名前の 1000 個のタグを持つ xml があります。すべてのタグには独自の属性がありますが、一部の属性は重複しています。

だから私はXMLを持っています:

... some other not duplicated attribute data ...
<book attribute="attr1"></book>
<book attribute="attr1"></book>
<book attribute="attr1"></book>
... some other not duplicated attribute data ...
<book attribute="attr2"></book>
<book attribute="attr2"></book>
<book attribute="attr2"></book>
... some other not duplicated attribute data ...

xsltを使用して、xmlにある属性の名前を複数回変更できるようにする方法はありますか:

... some other not duplicated attribute data...
<book attribute="attr1-1"></book>
<book attribute="attr1-2"></book>
<book attribute="attr1-3"></book>
... some other not duplicated attribute data ...
<book attribute="attr2-1"></book>
<book attribute="attr2-2"></book>
<book attribute="attr2-3"></book>
... some other not duplicated attribute data ...

これが xslt で可能であり、重複した属性が変わらないことを願っていますか? すべての回答に感謝します、eoglasi

4

3 に答える 3

1

入力 XML:

<?xml version="1.0" encoding="utf-8"?>
<test>
 <book attribute="attr1"></book>
 <book attribute="attr1"></book>
 <book attribute="attr1"></book>
 <book attribute="attr2"></book>
 <book attribute="attr2"></book>
 <book attribute="attr2"></book>
 <book attribute="attr5"></book>
</test>

次のスタイルシートがその仕事をするはずです。基本的に、グループ(「属性」と呼ばれる属性によるグループ化)が1つのアイテムのみで構成されているかどうか(つまり、属性値が一意であるかどうか)をチェックします。

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="yes"/>

<xsl:template match="/">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="test">
  <xsl:copy>
     <xsl:for-each-group select="book" group-by="@attribute">
        <xsl:choose>
           <xsl:when test="count(current-group()) = 1">
              <xsl:element name="book">
                 <xsl:attribute name="attribute">
                    <xsl:value-of select="@attribute"/>
                 </xsl:attribute>
              </xsl:element>
           </xsl:when>
           <xsl:otherwise>
              <xsl:for-each select="current-group()">
                 <xsl:element name="book">
                    <xsl:attribute name="attribute">
                       <xsl:value-of select="concat(current-grouping-key(), '-', position())"/>
                    </xsl:attribute>
                 </xsl:element>
              </xsl:for-each>
           </xsl:otherwise>
        </xsl:choose>
     </xsl:for-each-group>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

次の出力が得られます(入力ファイルに一意の属性値を 1 つ含めました)。

<test>
 <book attribute="attr1-1"/>
 <book attribute="attr1-2"/>
 <book attribute="attr1-3"/>
 <book attribute="attr2-1"/>
 <book attribute="attr2-2"/>
 <book attribute="attr2-3"/>
 <book attribute="attr5"/>
</test>

編集:これにより、同じ属性値を持つ隣接していない本の要素が並べ替えられることに注意してください。

于 2013-11-14T15:36:34.450 に答える