-1

複数の行データを含む XML があります。

<abc>
 <def>some text1</def>
 <xyz>stack overflow</xyz>
</abc>
<abc>
 <def>some text2</def>
 <xyz>stack overflow 2)</xyz>
</abc>
<abc>
 <def>some text</def>
 <xyz>stack overflow 3)</xyz>
</abc>

ここで、各行のチェックを開始するXSL 1.0のコードを書きたいと思います。 つまり、要素に値/テキスト "2)" のみが存在するかどうかです。ループ中に最初にテキスト "2)" に遭遇するたびに、"XSL_1.0 Programming" を値として出力し、ループを終了する必要があります。

4

3 に答える 3

2

あなたは間違った方法でこれに取り組んでいます.XSLTは手続き型言語ではなく、「ループを終了する」方法はありません. 代わりに、関心のあるノードをより宣言的な方法で識別する方法を考える必要があります。たとえば、XPath 式

abc[contains(., '2)')]

abcは、子孫テキスト ノードの任意の場所に文字列 "2)" を含むすべての要素を識別します。

(abc[contains(., '2)')])[1]

最初のそのような要素だけを抽出するか、一致する要素がない場合は空のノード セットを抽出します。abc「2)」を含む最初の要素までの要素を処理したいが、後続の要素は処理したくない場合は、次のようなものを使用できます

<xsl:for-each select="abc[not(preceding-sibling::abc[contains(., '2)')])]">
于 2013-02-05T11:53:31.453 に答える
1

Ian Roberts が説明したように、XSLT にはループを分割するという概念はありません。処理するノードを事前に決定する必要があります。「2)」が含まれる最初のabc要素までの要素にのみ関心があるように思えます。

ここではxsl:apply-templatesを使用する方が実際には良いかもしれません。

<xsl:apply-templates select="abc[not(preceding-sibling::abc[contains(xyz, '2)')])]" />

したがって、これは先行する '2)' 要素を持たないすべての要素を選択します。

次に、 xyz要素の内容に応じて、 abc要素に一致するテンプレートを追加できます。たとえば、「2)」がある場合に「XSL_1.0 Programming」を出力するには、次のようにします。

<xsl:template match="abc[contains(xyz, '2)')]">
    <xsl:text>XSL_1.0 Programming</xsl:text>
</xsl:template>

ここに完全な XSLT があります

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

    <xsl:template match="/*">
        <xsl:apply-templates select="abc[not(preceding-sibling::abc[contains(xyz, '2)')])]" />
    </xsl:template>

    <xsl:template match="abc">
        <xsl:value-of select="concat(xyz, '&#10;')" />
    </xsl:template>

    <xsl:template match="abc[contains(xyz, '2)')]">
        <xsl:text>XSL_1.0 Programming&#10;</xsl:text>
    </xsl:template>
</xsl:stylesheet>

次の XML に適用した場合 (ルート要素があることに注意してください)

<root>
<abc>
 <def>some text1</def>
 <xyz>stack overflow</xyz>
</abc>
<abc>
 <def>some text2</def>
 <xyz>stack overflow 2)</xyz>
</abc>
<abc>
 <def>some text3</def>
 <xyz>stack overflow</xyz>
</abc>
<abc>
 <def>some text</def>
 <xyz>stack overflow 3)</xyz>
</abc>
</root>

以下が出力されます

stack overflow
XSL_1.0 Programming
于 2013-02-05T13:10:37.000 に答える
0

これはどう:

<xsl:if test="abc[contains(xyz, '2)')]"> 
   <xsl:text>XSL_1.0 Programming</xsl:text> 
</xsl:if>
于 2013-02-05T12:37:04.013 に答える