xml - 将 2 xml 文件与 xslt 合并
问题描述
我有两个xml文件persons1和persons2,我想使用xslt将它们合并到一个xml文件中,我是xslt的新手,所以任何帮助将不胜感激:第一个文件persons1:
<personnes>
<personne>
<name>aaa</name>
<age>10</age>
<adress>aaaaaa</adress>
</personne>
<personne>
<name>bbb</name>
<age>10</age>
<adress>aaaaaa</adress>
</personne>
<personne>
<name>ccc</name>
<age>20</age>
<adress>cccccc</adress>
</personne>
<personne>
<name>ddd</name>
<age>10</age>
<adress>cccccc</adress>
</personne>
</personnes>
第二个档案persons2:
<personnes>
<personne>
<id>1111</id>
<quantity>1100</quantity>
</personne>
<personne>
<id>2222</id>
<quantity>2200</quantity>
</personne>
<personne>
<id>3333</id>
<quantity>3300</quantity>
</personne>
<personne>
<id>4444</id>
<quantity>4400</quantity>
</personne>
<personne>
<id>5555</id>
<quantity>5500</quantity>
</personne>
</personnes>
我想要一个新的 xml 文件中的结果,如下所示:
<personnes>
<personne>
<id>1111</id>
<name>aaa</name>
<quantity>1100</quantity>
<age>10</age>
<adress>aaaaaa</adress>
</personne>
<personne>
<id>2222</id>
<name>bbb</name>
<quantity>2200</quantity>
<age>10</age>
<adress>aaaaaa</adress>
</personne>
<personne>
<id>3333</id>
<name>ccc</name>
<quantity>3300</quantity>
<age>20</age>
<adress>cccccc</adress>
</personne>
<personne>
<id>4444</id>
<name>ddd</name>
<quantity>4400</quantity>
<age>10</age>
<adress>cccccc</adress>
</personne>
</personnes>
我想从文件中获取 id 和数量:persons2 并将它们放在 xml 文件中:persons1 所以一个接一个,这意味着第一个是第一个,第二个是第二个等等......
解决方案
<xsl:variable name="doc" select="document('person2.xml')"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="personnes">
<xsl:copy>
<xsl:for-each select="personne">
<xsl:variable name="pos" select="position()"/>
<xsl:copy>
<xsl:if test=".[$pos=$doc/personnes/personne/position()]">
<xsl:copy-of select="$doc/personnes/personne[position() =$pos]/id"/>
</xsl:if>
<xsl:if test="child::name">
<name>
<xsl:value-of select="name"/>
</name>
</xsl:if>
<xsl:if test=".[$pos=$doc/personnes/personne/position()]">
<xsl:copy-of select="$doc/personnes/personne[position() =$pos]/quantity"/>
</xsl:if>
<xsl:if test="child::age">
<age>
<xsl:value-of select="age"/>
</age>
</xsl:if>
<xsl:if test="child::adress">
<adress>
<xsl:value-of select="adress"/>
</adress>
</xsl:if>
</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:template>
You may also try this
推荐阅读
- python - 有没有办法将 seaborn 图表的图例移到图表之外或向右?
- javascript - 在预置 (x, y) 点模拟范围类型输入的 mousedown 事件
- python-3.x - Locust - drupal 网络表单请求
- linux - ncat echo服务器,将传入消息写入shell?
- python - PySpark3 从 https url 读取文件
- javascript - 如何为不同的 id 使用相同的 Javascript 函数
- c++ - 如何在 C++ 中访问指向数组的指针的值
- c# - 在 CustomValidationAttribute 中返回多个 ValidationResult
- vulkan - 在没有 renderdoc 的情况下运行可执行文件时出现 Renderdoc 统计信息覆盖
- google-app-engine - 将自定义域映射到应用引擎后未找到错误