使用XSLT使用另一个XML文件中的可选信息更新一个XML文件中的信息

时间:2013-05-03 17:44:22

标签: xml xslt

使用XSLT

在一个XML文件中使用另一个XML文件中的可选信息更新信息

如果我将usa11.xml更改为:

<?xml version="1.0" encoding="UTF-8"?>
<country>
  <state name="CA">
    <city>
      <street>
        El Comino Ave.
      </street>
  <library>
         library 11111.
        </library>
</city>
<city>
  <street>
    DeAnza Ave.
  </street>
  <library>
          library 22222.
        </library>
</city>
<city>
  <street>
    shoreline Ave.
  </street>
  <library>
         library 33333.
       </library>
</city>

和usaa22.xml as:

<?xml version="1.0" encoding="UTF-8"?>
<country>
 <state name="CA">
<city>
       <street>
            El Comino Ave.
       </street>
  <library>
          library AAAAA.
      </library>
     </city>
<city>
       <street>
          DeAnza Ave.
       </street>
  <library>
          library BBBBB.
      </library>
      </city>

然后使用usa22.xml的元素vaules来替换usa11.xml的元素,只要它们的街道名称相同: 然后得到输出usa33.xml,如:

<?xml version="1.0" encoding="UTF-8"?>
<country>
  <state name="CA">
   <city>
       <street>
         El Comino Ave.
       </street>
  <library>
          library AAAAA.
      </library>
  </city>
  <city>
       <street>
            DeAnza Ave.
       </street>
  <library>
          library BBBBB.
      </library>
  </city>
  <city>
        <street>
            shoreline Ave.
        </street>
   <library>
            library 33333.
        </library>
   </city>
</state>

请帮忙建议如何做到这一点??? 这里     “街道”,价值“El Comino Ave。”

将用作键或ID来查找usa22.xml中的实际匹配,然后是element的值     “library”,其值为“library 11111”。

在街道元素下方,街道值为“El Comino Ave”。将被替换为相同的街道价值“El Comino Ave.”但是“库AAAAA”的差异库值。在usa22.xml中成为“库BBBBB”。

请帮助提出任何想法如何使用xslt来做这个???

谢谢

1 个答案:

答案 0 :(得分:0)

尝试这样的事情:

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

    <xsl:variable name="u2" select="document('usaa22.xml')"/>
    <xsl:template match="city">
        <xsl:choose>
            <xsl:when test="$u2//city[street=current()/street]">
                <xsl:copy>
                    <xsl:apply-templates select="$u2//city[street=current()/street]/* " />
                </xsl:copy>
            </xsl:when>
            <xsl:otherwise>
                <xsl:copy>
                    <xsl:apply-templates select="@* | node() " />
                </xsl:copy>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

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

将生成以下输出:

<country>
    <state name="CA">
        <city>
            <street>
                El Comino Ave.
            </street>
            <library>
                library AAAAA.
            </library>
        </city>
        <city>
            <street>
                DeAnza Ave.
            </street>
            <library>
                library BBBBB.
            </library>
        </city>
        <city>
            <street>
                shoreline Ave.
            </street>
            <library>
                library 33333.
            </library>
        </city>
    </state>
</country>