将属性从xml文档复制到xml文档

时间:2015-05-22 13:25:43

标签: xml function xslt copy

我想从xml文档中选择属性并将它们放入另一个xml文档中。特别是,当第一个文档中的内容等于第二个文档中的内容时,我想将@ana和@lem从第二个文件复制到第一个文档。

doc1.xml看起来像:

<app xml:id="app11">
    <rdg wit="W5 W2 W1 W6 W4 W3"></rdg>
    <rdg wit="W10"><w>s'en</w></rdg>
    <rdg wit="W11"><w>s'en</w></rdg>
    <rdg wit="W8 W7"><w>vait</w> <w>entre</w> <w>lui</w></rdg>
    <rdg wit="W9"><w>va</w></rdg>
</app>
<app xml:id="app12">
    <rdg wit="W5 W2 W1 W6 W9 W4 W8 W3 W7"><w>et</w> <w>sa</w></rdg>
    <rdg wit="W10 W11"><w>aloient</w></rdg>
</app>
<app xml:id="app13">
    <rdg wit="W2 W1 W3"><w>conpaignie</w> <w>tot</w></rdg>
    <rdg wit="W10 W11"></rdg>
    <rdg wit="W5 W6 W9 W4"><w>compaignie</w></rdg>
    <rdg wit="W8 W7"><w>compaigne</w></rdg>
</app>

doc2.xml如下所示:

<w ana="VER" lem="s'en">s'en</w>
<w ana="PRE" lem="entre">entre</w>
<w ana="PRO:pers" lem="il">lui</w>
<w ana="CON:coord" lem="et">et</w>
<w ana="DET:poss" lem="son">sa</w>
<w ana="NOM" lem="compagnie">compaigne</w>
<w ana="PRO:ind" lem="tot">tout</w>
<w ana="ADJ" lem="droit">droit</w>
<w ana="PRE" lem="apres">apres</w>
<w ana="VER" lem="aler">aloient</w>
<w ana="PRO:ind" lem="tot">tout</w>
<w ana="ADJ" lem="droit">droit</w>
<w ana="VER" lem="aler">vait</w>
<w ana="VER" lem="defendre">deffendre</w>
<w ana="PRE" lem="contre">contre</w>
<w ana="DET:def" lem="le">le</w>

我已尝试使用此XSLT,但它不起作用

<?xml version="1.0" encoding="UTF-8"?>

<xsl:template match="@* | node()">
    <xsl:copy-of select="."/>
</xsl:template>


<xsl:template match="//w">
    <xsl:if test=".[text()]=document(doc2.xml)//w[text()]">
        <xsl:copy>
            <xsl:attribute name="ana">
                <xsl:value-of
                    select="document(doc2.xml)//w/@ana"/>
            </xsl:attribute>
        </xsl:copy>
    </xsl:if>
    <xsl:apply-templates/>
</xsl:template>

<!-- 
<xsl:copy-of select="document(doc2.xml)//w[@ana] and document(doc2.xml)//w[@lem]"></xsl:copy-of>
-->

有什么建议吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

使用这样的样式表(XSLT 1.0),它可能会更好用:

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


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


<xsl:template match="w">
    <xsl:copy>
    <xsl:if test="$ws//w[text() = current()]">
        <xsl:copy-of select="$ws//w[text() = current()]/@ana" />
    </xsl:if>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

生成的XML将是:

  <app xml:id="app11">
      <rdg wit="W5 W2 W1 W6 W4 W3"/>
      <rdg wit="W10">
         <w ana="VER">s'en</w>
      </rdg>
      <rdg wit="W11">
         <w ana="VER">s'en</w>
      </rdg>
      <rdg wit="W8 W7">
         <w ana="VER">vait</w>
         <w ana="PRE">entre</w>
         <w ana="PRO:pers">lui</w>
      </rdg>
      <rdg wit="W9">
         <w>va</w>
      </rdg>
   </app>
   <app xml:id="app12">
      <rdg wit="W5 W2 W1 W6 W9 W4 W8 W3 W7">
         <w ana="CON:coord">et</w>
         <w ana="DET:poss">sa</w>
      </rdg>
      <rdg wit="W10 W11">
         <w ana="VER">aloient</w>
      </rdg>
   </app>
   <app xml:id="app13">
      <rdg wit="W2 W1 W3">
         <w>conpaignie</w>
         <w>tot</w>
      </rdg>
      <rdg wit="W10 W11"/>
      <rdg wit="W5 W6 W9 W4">
         <w>compaignie</w>
      </rdg>
      <rdg wit="W8 W7">
         <w ana="NOM">compaigne</w>
      </rdg>
   </app>