40

次の質問は少し初心者向けですが、基本的な概念を理解するためにあなたの助けが必要です.

最初に言っておきたいのは、私は XSLT プログラマーとして 3 年間働いていますが、ここで学んできた新しい非常に基本的な事柄がいくつかあるということです。関与)。

私の質問は: の使用法はxsl:sequence何ですか?

xsl:copy-ofノードをそのままコピーするxsl:apply-templatesため、選択したノードを変更するため、およびvalue-of単純なテキストのために使用しています。

を使用する必要はありませんでしたxsl:sequencexsl:sequence誰かが私に上記のものなしでは達成できない、または好ましい使用例を示してくれれば幸いです。

もう1つ、コースの定義について読みましたxsl:sequenceが、それがどのように役立つかを推測できませんでした。

4

4 に答える 4

48

<xsl:sequence>アトミック値(またはアトミック値のシーケンス)は、<xsl:copy-of>両方が入力のコピーを返すのと同じです。違いは、ノードを検討するときに発生します。

$ nが単一要素ノードの場合、たとえば次のようなもので定義されている場合

<xsl:variable name="n" select="/html"/>

それで

<xsl:copy-of select="$n"/>

ノードのコピーを返します。名前と子の構造は同じですが、新しいIDを持つ(親がない)新しいノードです。

<xsl:sequence select="$n"/>

ノード$nを返します。返されたノードは$nと同じ親を持ち、isXpath演算子によってそれと等しくなります。

従来の(XSLT 1スタイル)テンプレートの使用法では、どちらの操作の結果にもアクセスできないため、違いはほぼ完全にマスクされます。コンストラクターの結果は暗黙的xsl:sequenceに出力ツリーにコピーされるため、コピーを作成しないという事実はマスクされます。 。

<xsl:template match="a">
   <x>
   <xsl:sequence select="$n"/>
   </x>
</xsl:template>

と同じです

<xsl:template match="a">
    <x>
    <xsl:copy-of select="$n"/>
    </x>
</xsl:template>

どちらも新しい要素ノードを作成し、コンテンツの結果を新しいノードの子としてコピーxします。

ただし、関数を使用すると、違いがすぐにわかります。

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

    <xsl:variable name="s">
        <x>hello</x>
    </xsl:variable>

    <xsl:template name="main">
        ::
        :: <xsl:value-of select="$s/x is f:s($s/x)"/>
        :: <xsl:value-of select="$s/x is f:c($s/x)"/>
        ::
        :: <xsl:value-of select="count(f:s($s/x)/..)"/>
        :: <xsl:value-of select="count(f:c($s/x)/..)"/>
        ::
    </xsl:template>

    <xsl:function name="f:s">
        <xsl:param name="x"/>
        <xsl:sequence select="$x"/>
    </xsl:function>

    <xsl:function name="f:c">
        <xsl:param name="x"/>
        <xsl:copy-of select="$x"/>
    </xsl:function>

</xsl:stylesheet>

生産する

$ saxon9 -it main seq.xsl
<?xml version="1.0" encoding="UTF-8"?>
::
:: true
:: false
::
:: 1
:: 0
::

ここでは、xsl:sequenceとの結果xsl:copy-ofが根本的に異なります。

于 2013-01-16T17:35:16.793 に答える
30

xsl:sequenceの最も一般的な使用例は、xsl:functionから結果を返すことです。

<xsl:function name="f:get-customers">
  <xsl:sequence select="$input-doc//customer"/>
</xsl:function>

ただし、他のコンテキストでも便利です。たとえば、

<xsl:variable name="x" as="element()*">
  <xsl:choose>
    <xsl:when test="$something">
       <xsl:sequence select="//customer"/>
    </xsl:when>
    <xsl:otherwise>
       <xsl:sequence select="//supplier"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:variable>

ここで重要なのは、元のノードへの参照を返し、新しいコピーを作成しないことです。

于 2013-01-16T18:13:09.367 に答える
8

xsl:sequence名前にもかかわらず、使用する特定のタイプの値を返すには、xsl:value-of常にテキストノードが作成されます(XSLT 1.0以降)。したがって、関数本体では、

  <xsl:sequence select="42"/>

値を返すにはxs:integer、次を使用します

<xsl:sequence select="'foo'"/>

xs:string値を返し、

<xsl:sequence select="xs:date('2013-01-16')"/>

値などを返しxs:dateます。もちろん、たとえばでシーケンスを返すこともできます<xsl:sequence select="1, 2, 3"/>

私の見解では、これらの場合、非効率的であるため、テキストノードや要素ノードを作成することは望ましくありません。

これが私の考えです。XSLTとXPath2.0の新しいスキーマベースの型システムでは、これらの型の値を返すか渡す方法が必要であり、新しい構成が必要でした。

[編集]MichaelKayは、「XSLT2.0およびXPath2.0プログラマーズリファレンス」で次のように述べていますxsl:sequence。「XSLT2.0で導入されたこの無邪気な外観の命令は、XSLT命令とシーケンスコンストラクター(したがって、関数とテンプレート)は、XPathデータモデルで許可されている任意の値を返すことができるようになります。これがないと、XSLT命令は結果ツリーに新しいノードを作成するためにのみ使用できますが、これを使用すると、アトミック値と参照を返すこともできます。既存のノード。」

于 2013-01-16T16:07:08.463 に答える
0

もう 1 つの用途は、子がある場合にのみタグを作成することです。例が必要です:

<a>
    <b>node b</b>
    <c>node c</c>
</a>

XSLT のどこかに:

<xsl:variable name="foo">
    <xsl:if select="b"><d>Got a "b" node</d></xsl:if>
    <xsl:if select="c"><d>Got a "c" node</d></xsl:if>
</xsl:variable>
<xsl:if test="$foo/node()">
    <wrapper><xsl:sequence select="$foo"/></wrapper>
</xsl:if>

ここでデモを見ることができます: http://xsltransform.net/eiZQaFz

次のように各タグをテストするよりもはるかに優れています。

<xsl:if test="a|b">...</xsl:if>

2 か所で編集することになるからです。また、処理速度は、入力に含まれるタグによって異なります。それがテストの最後のものである場合、エンジンは以前の全員の存在をテストします。$foo/node() は「子要素はありますか?」のイディオムなので、エンジンはそれを最適化できます。そうすることで、みんなの生活が楽になります。

于 2015-04-17T09:07:38.807 に答える