XSLT: сравнение XPath между двумя файлами - PullRequest
2 голосов
/ 10 марта 2011

Я бы хотел сравнить два XML-файла через XSLT.Сравнение следует считать успешным, если все элементы определенного типа в документе 1 расположены в одной и той же позиции XPath в документе 2.

Рассматривать

<entry>
    <entry1>
        <entry2>
            <value type="1"/>
        </entry2>
    </entry1>
</entry>

как документ 1.

Наблюдаемым элементом является «значение» (с типом атрибута = 1), которое находится в entry / entry1 / entry2.Поэтому сравнение в этом смысле с

<entry>
    <entry0/>
    <entry0/>
    <entry1>
        <entry2>
            <value type="1"/>
        </entry2>
    </entry1>
</entry>

следует рассматривать как успешное, в то время как

<entry>
    <entry1>
        <value type="1"/>
    </entry1>
</entry>

не является успешным, поскольку «значение» (с типом атрибута = 1) находится взапись / entry1.Также сравнение с

<entry>
    <entry1>
        <entry2>
            <value type="2"/>
        </entry2>
    </entry1>
</entry>

следует рассматривать как неуспешное, поскольку атрибут value имеет тип = 2.

Мой наивный тест на выполнение этой задачи в XSLT был примерно таким:

<xsl:template match="value">
   <xsl:if test="not(document($doc2)/.[@type=@type])">
      <xsl:text>something is missing</xsl:text>
   </xsl:if>
</xsl:template>

Этот подход не увенчался успехом, поскольку выбор требуемого XPath во втором документе, похоже, не работает.

Может быть, у вас есть идея, как решить этот вопрос?

Мэтт

Ответы [ 2 ]

3 голосов
/ 10 марта 2011

Ваш вопрос безнадежно занижен.Например, требуется ли каждому элементу в doc1 иметь соответствующий элемент в doc2, требуется ли также, чтобы каждый элемент в doc2 имел соответствующий элемент в doc1?

Однако что-то близкое может быть условием "для каждого элемента V1 в D1, такого, что name(V1)=N, существует элемент V2 в D2, такой, что name(V2)=N and deep-equal(V1, V2) and path(V1) = path(V2), где путь ($ V) определен как string-join($V/ancestor-or-self::*/name())" , что переводится в следующее выражение XPath 2.0:

every $V1 in $D1//N satisfies
some $V2 in $D2//N satisfies
deep-equal($V1, $V2) and
string-join($V1/ancestor-or-self::*/name())
 = string-join($V2/ancestor-or-self::*/name())  
0 голосов
/ 10 марта 2011

Ради интереса: перевод XSLT 1.0 ответа доктора Кея :

    <xsl:variable name="vTest1">
        <xsl:for-each select="$D1//value[@type]">
            <xsl:variable name="vPath1">
                <xsl:for-each select="ancestor-or-self::*">
                    <xsl:value-of select="concat('/',name())"/>
                </xsl:for-each>
            </xsl:variable>
            <xsl:variable name="vTest2">
                <xsl:for-each select="$D2//value[@type=current()/@type]">
                    <xsl:variable name="vPath2">
                        <xsl:for-each select="ancestor-or-self::*">
                            <xsl:value-of select="concat('/',name())"/>
                        </xsl:for-each>
                    </xsl:variable>
                    <xsl:if test="$vPath1=$vPath2">True</xsl:if>
                </xsl:for-each>
            </xsl:variable>
            <xsl:if test="$vTest2=''">False</xsl:if>
        </xsl:for-each>
    </xsl:variable>

Тогда $vTest1 = '' будет логическим значением теста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...