1

xslt でスタイルを設定しようとしているドキュメントがたくさんあり、次のようなコードがあります。

<tag1>Something</tag1>
<tag2>Something else</tag2>
<tag3>...</tag3>

ただし、一部のドキュメントでは、次のものしかない場合があります。

<tag2>Something else</tag2>
<tag3>...</tag3>

<h2>Heading</h2>ドキュメントをレンダリングするときに、tag1、tag2、または tag3 (いずれか早い方) の前に" " を追加したいと考えています。これは可能ですか?

4

5 に答える 5

3

これと同じくらい簡単です (条件付き命令なしxsl:element、 no starts-with()、 no 、preceding-sibling::軸なし、モードなし、標準の同一性規則をオーバーライドする 1 つのテンプレートのみ):

<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()|@*" name="identity">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="*[self::tag1 or self::tag2 or self::tag3][1]">
   <h2>Heading</h2>
   <xsl:call-template name="identity"/>
 </xsl:template>
</xsl:stylesheet>

この変換が次の XML ドキュメントに適用される場合(提供されたフラグメントは、単一の最上位要素にラップされ、整形式の XML ドキュメントになります):

<t>
    <tag1>Something</tag1>
    <tag2>Something else</tag2>
    <tag3>...</tag3>
</t>

必要な正しい結果が生成されます。

<t>
   <h2>Heading</h2>
   <tag1>Something</tag1>
   <tag2>Something else</tag2>
   <tag3>...</tag3>
</t>

注意してください:

多くの要素名がある場合 (必ずしも同じ文字列で始まるとは限りません)、次のように最後のテンプレートの一致パターンを書き換える方が短く実用的です。

 <xsl:template match=
  "*[contains('|tag1|tag2|tag3|', concat('|',name(),'|'))][1]">
于 2012-11-08T04:42:55.753 に答える
1
<xsl:if test="count(./preceding-sibling::*)=0"><h2>Heading</h2></xsl:if>

これは、ドキュメント内で現在のノードの前に兄弟要素が 0 個ある (つまり、親ノードの最初の要素である) ことを意味します。しかし、コメントしたように、親要素を見つけて H2 をその出力の先頭に追加すると、パフォーマンスが大幅に向上します。

常に含まれるタグがあり、最悪の場合はドキュメント要素自体です。

于 2012-11-08T01:36:33.600 に答える
0

少し異なるアプローチ:

<xsl:template match="*[tag1|tag2|tag3]">
<xsl:element name="{name()}">
<h2>Heading</h2>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>

<xsl:template match="tag1|tag2|tag3">
<xsl:element name="{name()}"><xsl:apply-templates/></xsl:element>
</xsl:template>
于 2012-11-08T01:41:49.493 に答える
0

これが私のために働いたことがわかったものです:

<xsl:template match="*[starts-with(name(), 'tag')][1]" priority="1">
  <h2>Heading</h2>

  <xsl:apply-templates select="." mode="display"/>
</xsl:template>

<xsl:template match="*[starts-with(name(), 'tag')]">
  <xsl:apply-templates select="." mode="display"/>
</xsl:template>

<xsl:template match="root/tag1" mode="display">
  <p>First tag:
  <xsl:apply-templates />
  </p>
</xsl:template>

<xsl:template match="root/tag2" mode="display">
  <p>Second tag:
  <xsl:apply-templates />
  </p>
</xsl:template>

<xsl:template match="root/tag3" mode="display">
  <p>Third tag:
  <xsl:apply-templates />
  </p>
</xsl:template>

少し風変わりですが、うまく機能します。

于 2012-11-08T03:12:44.250 に答える
0

この XSLT 1.0 スタイルシート...

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

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

<xsl:template match="*[self::tag1|self::tag2|self::tag3]
                      [not(preceding-sibling::tag1|
                           preceding-sibling::tag2|
                           preceding-sibling::tag3)]">
  <h2>Heading</h2>
  <xsl:call-template name="ident" />
</xsl:template>      
</xsl:stylesheet>

...または同等に、この XSLT 2.0 のもの...

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

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

<xsl:template match="*[self::tag1|self::tag2|self::tag3]
                      [not(preceding-sibling::tag1|
                           preceding-sibling::tag2|
                           preceding-sibling::tag3)]">
  <h2>Heading</h2>
  <xsl:next-match />
</xsl:template>      
</xsl:stylesheet>

...この入力ドキュメントを変換します..

<t>
  <branch1>
    <something-before/>
    <tag1>Something</tag1>
    <tag2>Something else</tag2>
    <tag3>tag3 content</tag3>
    <something-after/>
  </branch1>
  <branch2>
    <something-before/>
    <tag3>tag3 content</tag3>
    <tag2>Something else</tag2>
    <something-after/>
  </branch2>
</t>

...の中へ...

<t>
  <branch1>
    <something-before />
    <h2>Heading</h2>
    <tag1>Something</tag1>
    <tag2>Something else</tag2>
    <tag3>tag3 content</tag3>
    <something-after />
  </branch1>
  <branch2>
    <something-before />
    <h2>Heading</h2>
    <tag3>tag3 content</tag3>
    <tag2>Something else</tag2>
    <something-after />
  </branch2>
</t>
于 2012-11-08T04:42:32.003 に答える