【问题标题】:merge xml matching attributes value合并xml匹配属性值
【发布时间】:2016-04-12 13:29:30
【问题描述】:

我正在尝试通过匹配属性的值来合并两个 xml 文件。 xml 文件来自带有“--xml”输出的 mysql 查询。

file1.xml

<?xml version="1.0"?>
<resultset statement="SELECT" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <row>
   <field name="ID_editore">20</field>
   <field name="nome">Name1</field>
   <field name="biografia">Bib1</field>
   <field name="autoricat"></field>
 </row>
 <row>
   <field name="ID_editore">21</field>
   <field name="nome">Name2</field>
   <field name="biografia">Bib2</field>
   <field name="autoricat">text2</field>
 </row>
</resultset>

file2.xml

<?xml version="1.0"?>
<resultset statement="SELECT" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <row>
  <field name="editore_ID">20</field>
  <field name="data">1929</field>
  <field name="indirizzo">Address 1</field>
</row>
 <row>
  <field name="editore_ID">21</field>
  <field name="data">1950</field>
  <field name="indirizzo">Address 2</field>
 </row>
</resultset>

期望的合并:

<?xml version="1.0"?>
<resultset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" statement="SELECT">
 <row>
  <field name="ID_editore">20</field>
  <field name="nome">Name1</field>
  <field name="biografia">Bib1</field>
  <field name="autoricat"/>
  <field name="data">1929</field>
  <field name="indirizzo">Address 1</field>
 </row>
 <row>
  <field name="ID_editore">21</field>
  <field name="nome">Name2</field>
  <field name="biografia">Bib2</field>
  <field name="autoricat">text2</field>
  <field name="data">1950</field>
  <field name="indirizzo">Address 2</field>
 </row>
</resultset>

使用下面的样式表我得到了错误的结果,因为我不知道如何匹配正确的属性值:

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

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

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

     <xsl:copy-of select="document('file2.xml')
            /resultset/row/field[(@name='editore_ID')=current()[@name='ID_editore']]"/>

    </xsl:copy>
 </xsl:template>

 </xsl:stylesheet>

上述样式表的错误结果:

<?xml version="1.0"?>
<resultset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" statement="SELECT">
 <row>
    <field name="ID_editore">20</field>
    <field name="nome">Name1</field>
    <field name="biografia">Bib1</field>
    <field name="autoricat"/>
    <field name="data">1929</field>
    <field name="indirizzo">Address 1</field>
    <field name="data">1950</field>
    <field name="indirizzo">Address 2</field>
   </row>
   <row>
    <field name="ID_editore">21</field>
    <field name="nome">Name2</field>
    <field name="biografia">Bib2</field>
    <field name="autoricat">text2</field>
    <field name="data">1929</field>
    <field name="indirizzo">Address 1</field>
    <field name="data">1950</field>
    <field name="indirizzo">Address 2</field>
   </row>
  </resultset>

我运行这个命令来获取输出

xsltproc stylesheet.xsl file1.xml 

【问题讨论】:

    标签: xml xslt merge


    【解决方案1】:

    您可以尝试在 xsl:copy-of 中使用以下 XPath 表达式:

    document('file2.xml.xml')
        /resultset
        /row
        /field[
            @name='editore_ID' and .=current()/field[@name='ID_editore']
        ]
        /following-sibling::field
    

    XPath 首先找到与当前ID_editore 匹配的editore_ID,然后返回所有后续的兄弟field 元素(这样editore_ID 本身就不会复制到输出XML 中)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      相关资源
      最近更新 更多