【问题标题】:Join two xml files based on common id value根据共同的 id 值加入两个 xml 文件
【发布时间】:2016-09-22 22:29:39
【问题描述】:

我见过许多类似的答案,但没有一个比这个简单的案例更相似。

在下面的示例中,我将如何将州名加入城市以创建输出?

输入文件#1

<cities>
  <city>
    <state_id>100<state_id>
    <city_name>Los Angeles</city_name>
  </city>
  <city>
    <state_id>100<state_id>
    <city_name>San Francisco</city_name>
  </city>
  <city>
    <state_id>200<state_id>
    <city_name>Chicago</city_name>
  </city>
</cities>

输入文件#2

<states>
  <state>
    <id>100</id>
    <name>California</name>
  </state>
  <state>
    <id>200</id>
    <name>Illinois</name>
  </state>
  <state>
    <id>300</id>
    <name>Texas</name>
  </state>
</states>

输出

<cities>
  <city>
    <state_id>100<state_id>
    <city_name>Los Angeles</city_name>
    <name>California</name>
  </city>
  <city>
    <state_id>100<state_id>
    <city_name>San Francisco</city_name>
    <name>California</name>
  </city>
  <city>
    <state_id>200<state_id>
    <city_name>Chicago</city_name>
    <name>Illinois</name>
  </city>
</cities>

【问题讨论】:

  • 您的处理器是否支持 XSLT 2.0?

标签: xml xslt


【解决方案1】:

考虑使用 XSLT 1.0 document() 函数,该函数允许跨文档引用相对路径,拉取特定节点。在转换期间从 States.xml 中提取数据的 City.xml 上应用以下 XSLT,假设两者位于同一目录中:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output version="1.0" encoding="UTF-8" indent="yes"  method="xml"/>
<xsl:strip-space elements="*"/>

  <xsl:template match="/cities">
    <xsl:copy>
      <xsl:apply-templates select="city"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="city">
    <xsl:copy>
      <xsl:variable name="statevar" select="state_id"/>
      <xsl:copy-of select="state_id|city_name"/>
      <xsl:copy-of select="document('States.xml')/states/state[id=$statevar]/name"/>
    </xsl:copy>
  </xsl:template>

</xsl:transform>

【讨论】:

    猜你喜欢
    • 2014-03-31
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多