0

これに関する多くの投稿を見てきましたが、どれも私の問題を理解するのに役立ちませんでした。

Test1.xml

<table>
    <row>
        <col1>A</col1>
    </row>
    <row>
        <col1>B</col1>
    </row>
    <row>
        <col1>C</col1>
    </row>
</table>

Test2.xml

<table>
    <row>
        <col1>A</col1>
        <col2>ABC</col2>
    </row>
    <row>
        <col1>B</col1>
        <col2>ABC</col2>
    </row>
    <row>
        <col1>A</col1>
        <col2>ABC</col2>
    </row>
    <row>
        <col1>C</col1>
        <col2>ABC</col2>
    </row>
    <row>
        <col1>A</col1>
        <col2>DEF</col2>
    </row>

</table>

Test.xsl (XSLT 1.0)

<xsl:variable name="input" select="document('test1.xml')/>

<xsl:template match="/">
    <xsl:apply-templates select="$input" mode="special"/>
</xsl:template>

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

<xsl:template match="Row" mode="special">
    <xsl:variable name="cols" select="document('test2.xml')/Table/Row[current()/Col1 = Col1]/Col2"/>
    <xsl:variable name="unique_cols" select="$cols[not(. =  preceding-sibling::*)]"/>

    <!-- Debug -->
    <xsl:for-each select="$unique_cols">
        <xsl:copy-of select="."/>
    </xsl:for-each>
    ----
</xsl:template>

期待される出力:

<col2>ABC</col2>
<col2>DEF</col2>
----
<col2>ABC</col2>
----
<col2>ABC</col2>

現在の出力:

<col2>ABC</col2>
<col2>ABC</col2>
<col2>DEF</col2>
----
<col2>ABC</col2>
----
<col2>ABC</col2>

$unique_cols の col2 値は、col1 値ごとに異なる必要があります。$cols で一意の col2 値を選択できれば、なおさらです。

4

2 に答える 2

0

置き換えるだけです:

    <xsl:variable name="unique_cols" select="$cols[not(. =  preceding-sibling::*)]"/>

:

    <xsl:variable name="unique_cols" select=
         "$cols[not(../col1 =  ../preceding-sibling::*/col1)]"/>

完全な変換 (最初は多数の字句エラーを修正するために修正されました) は次のようになります (これも私自身のファイル Uris を使用):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:variable name="input" select=
      "document('file:///c:/temp/delete/test1.xml')"/>

    <xsl:template match="/">
        <xsl:apply-templates select="$input" mode="special"/>
    </xsl:template>

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

    <xsl:template match="row" mode="special">
        <xsl:variable name="cols" select=
        "document('file:///c:/temp/delete/test2.xml')
             /table
               /row[current()/col1 = col1]
                 /col2"/>
        <xsl:variable name="unique_cols" select=
             "$cols[not(../col1 =  ../preceding-sibling::*/col1)]"/>

        <!-- Debug -->
        <xsl:for-each select="$unique_cols">
            <xsl:copy-of select="."/>
        </xsl:for-each>
        ----
    </xsl:template>
</xsl:stylesheet>

ファイルは次のとおりです。

c:/temp/delete/test1.xml:

<table>
    <row>
        <col1>A</col1>
    </row>
    <row>
        <col1>B</col1>
    </row>
    <row>
        <col1>C</col1>
    </row>
</table>

そして: c:/temp/delete/test2.xml:

<table>
    <row>
        <col1>A</col1>
        <col2>ABC</col2>
    </row>
    <row>
        <col1>B</col1>
        <col2>ABC</col2>
    </row>
    <row>
        <col1>A</col1>
        <col2>ABC</col2>
    </row>
    <row>
        <col1>C</col1>
        <col2>ABC</col2>
    </row>
</table>

任意の XML ドキュメント (使用されていない) に対して変換が実行されると、必要な正しい結果が生成されます。

<table>

   <col2>ABC</col2>
        ----

    <col2>ABC</col2>
        ----

    <col2>ABC</col2>
        ----

</table>
于 2012-11-03T03:39:45.247 に答える
0

別の投稿 (https://groups.google.com/forum/?fromgroups#!topic/microsoft.public.xsl/i8FwJUD0r8U) で提供された回答に基づいて、これを理解した可能性があると思います。

<xsl:variable name="cols" select=
   "document('test2.xml')/table/row[current()/col1 = col1]/col2[not(. = ../preceding-sibling::*/col2[current()/col1 = ../col1])]"/>

これにより、一意の col2 値が $cols に選択され、2 番目の変数が不要になるようです。

于 2012-11-06T16:37:15.077 に答える