Ввод нескольких файлов в XSLT-преобразовании - PullRequest
1 голос
/ 02 декабря 2010

Я хочу обновить одно значение xml другим xml.

Предположим, у меня есть xml с корневым узлом

<Customer>
  <Fname>John</Fname>
  <Lname>Smith<Lname>
</Customer>

Другой xml имеет

<Customer>                                
  <Lname>Smith<Lname>
</Customer>

Я хочу перевести <Fname>John</Fname> с 1-го на 2-й xml, если эта информация отсутствует во 2-м xml.

Возможно ли это с помощью xslt в .net?

1 Ответ

3 голосов
/ 02 декабря 2010

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="kElementByAncestors" match="*"
             use="concat(name(../..),'+',name(..))"/>
    <xsl:key name="kAttributeByAncestors" match="@*"
             use="concat(name(../..),'+',name(..))"/>
    <xsl:param name="pSource2" select="'source2.xml'"/>
    <xsl:variable name="vSource2" select="document($pSource2,/)"/>
    <xsl:template match="*">
        <xsl:variable name="vKey" select="concat(name(..),'+',name())"/>
        <xsl:variable name="vCurrent" select="."/>
        <xsl:copy>
            <xsl:for-each select="$vSource2">
                <xsl:variable name="vNames">
                    <xsl:text>|</xsl:text>
                    <xsl:for-each select="$vCurrent/*">
                        <xsl:value-of select="concat(name(),'|')"/>
                    </xsl:for-each>
                </xsl:variable>
                <xsl:copy-of select="key('kAttributeByAncestors',$vKey)"/>
                <xsl:copy-of select="$vCurrent/@*"/>
                <xsl:copy-of
                     select="key('kElementByAncestors',
                                 $vKey)[not(contains($vNames,
                                                     concat('|',
                                                            name(),
                                                            '|')))]"/>
            </xsl:for-each>
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

С этим входом:

<Customer>
    <Lname>Smith</Lname>
    <Data>Data</Data>
</Customer>

И "source2.xml":

<Customer test="test">
    <Fname>John</Fname>
    <Lname>Smith</Lname>
</Customer>

Выход:

<Customer test="test">
    <Fname>John</Fname>
    <Lname>Smith</Lname>
    <Data>Data</Data>
</Customer>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...