1

この質問では、XSLT を使用して同じ値が連続して出力されるのを防ぐことができるかどうかを尋ねました。この質問では、XSLT 1.0 構文のMuenchian Grouping メソッドがより明確になるように、入力データを拡張します。

XSL 変換を使用して、XML ドキュメント内の値の最初の出現のみを照合することは可能ですか?

f2,f3 内のすべての値を出力したいのですが、順序を保持して f1 の内容の最初のインスタンスのみを出力します。

XML データ

    <doc> 
    <datum>
        <f1>One</f1>
        <f2>Monday</f2>
        <f3>January</f3>
      </datum>
      <datum>
        <f1>One</f1>
        <f2>Tuesday</f2>
        <f3>February</f3>
      </datum>
      <datum>
        <f1>Two</f1>
        <f2>Wednesday</f2>
        <f3>March</f3>
    </datum>
    </doc>

出力

      One
      -Monday-January
      -Tuesday-February
      Two
      -Wednesday-March

これは、フィールド f1 および f2 を含む入力データ セットに対して、Dimitre Novatchev によって XSLT 1.0 用に提案されたソリューションです。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:key name="kDatumByF1" match="datum" use="f1"/>

 <xsl:template match=
   "datum[generate-id() = generate-id(key('kDatumByF1', f1)[1])]">
   <xsl:value-of select="concat('&#xA;', f1)"/>
   <xsl:apply-templates select="key('kDatumByF1', f1)/f2" mode="inGroup"/>
 </xsl:template>

 <xsl:template match="f2" mode="inGroup">
   - <xsl:value-of select="."/>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

それは非常にうまく機能しますが、出力にフィールド「f3」を含めるために拡張する構文がわかりません。

4

2 に答える 2

2
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:key name="kDatumByF1" match="datum" use="f1"/>

 <xsl:template match=
   "datum[generate-id() = generate-id(key('kDatumByF1', f1)[1])]">
   <xsl:value-of select="concat('&#xA;', f1)"/>
   <xsl:apply-templates select="key('kDatumByF1', f1)/*[self::f2 | self::f3]" mode="inGroup"/>
 </xsl:template>

 <xsl:template match="f2" mode="inGroup">
   - <xsl:value-of select="."/>
 </xsl:template>

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

 <xsl:template match="text()"/>
</xsl:stylesheet>
于 2012-08-15T03:33:28.037 に答える
1

This transformation:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output method="text"/>
     <xsl:strip-space elements="*"/>
     <xsl:key name="kDatumByF1" match="datum" use="f1"/>

     <xsl:template match=
       "datum[generate-id() = generate-id(key('kDatumByF1', f1)[1])]">
       <xsl:value-of select="concat(f1, '&#xA;')"/>
       <xsl:apply-templates mode="inGroup"
           select="key('kDatumByF1', f1)/*[self::f2 or self::f3]" />
     </xsl:template>

     <xsl:template match="f2|f3" mode="inGroup">
       <xsl:value-of select="concat('- ',., ' ')"/>
       <xsl:if test="not(following-sibling::*[self::f2 or self::f3])">
        <xsl:text>&#xA;</xsl:text>
       </xsl:if>
     </xsl:template>
     <xsl:template match="text()"/>
</xsl:stylesheet>

when applied on the provided XML document:

<doc>
    <datum>
        <f1>One</f1>
        <f2>Monday</f2>
        <f3>January</f3>
    </datum>
    <datum>
        <f1>One</f1>
        <f2>Tuesday</f2>
        <f3>February</f3>
    </datum>
    <datum>
        <f1>Two</f1>
        <f2>Wednesday</f2>
        <f3>March</f3>
    </datum>
</doc>

produces the wanted, correct result:

One
- Monday - January 
- Tuesday - February 
Two
- Wednesday - March 

Explanation:

Proper use of the Muenchian grouping method.

Do note:

This solution produces the wanted result even if f2 and f3 can come in any order.

于 2012-08-15T03:44:06.680 に答える