将两个源映射到一个输出

时间:2014-01-14 08:45:35

标签: java xslt

我想在两个来源上执行XSLT。

Sourch_1.xml:

<Root>
<record>
    <PolicyNumber>1</PolicyNumber>
    <FirdsName>aa</FirdsName>
    <LastName>aa</LastName>
</record>
<record>
    <PolicyNumber>2</PolicyNumber>
    <FirdsName>bb</FirdsName>
    <LastName>bb</LastName>
</record>

Sourch_2.xml:

<Root>
<record>
    <policy>
        <PolicyNumber>1</PolicyNumber>
        <city>aaCity</city>
        <street>aaStreet</street>
    </policy>
    <policy>
        <PolicyNumber>2</PolicyNumber>
        <city>bbCity</city>
        <street>bbStreet</street>
    </policy>
</record>

我希望输出创建标签,根据PolicyNumber组合来自两个来源的数据。

我希望我的输出为:

output.xml:

<Root>
<record_data>
    <PolicyNumber>1</PolicyNumber>
    <FirdsName>aa</FirdsName>
    <LastName>aa</LastName>
    <city>aaCity</city>
    <street>aaStreet</street>
</record_data>
<record_data>
    <PolicyNumber>2</PolicyNumber>
    <FirdsName>bb</FirdsName>
    <LastName>bb</LastName>
    <city>bbCity</city>
    <street>bbStreet</street>
</record_data>

如何使用XSLT实现这一目标?

2 个答案:

答案 0 :(得分:1)

要处理多个XML输入文件,请使用document()功能。确保其他XML文件也位于放置XSLT样式表的文件夹中。

引人注目的一行如下:

<xsl:for-each select="document('double2.xml')/root/record/policy[./PolicyNumber=current()/PolicyNumber]">

首先,document('double2.xml')打开第二个XML文件(我将其命名为“double2.xml”)。对于第二个XML文件中的policy元素,它检查其PolicyNumber是否等于正在处理的第一个XML文件中PolicyNumber元素的record


我稍微修改了您的输入以使其格式良好(小写root元素并添加其结束标记)。请注意,它中也有一个拼写错误,你可能想写“FirstName”而不是“FirdsName”。

<强>样式表

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

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

<xsl:output method="xml" indent="yes"/>

<xsl:template match="/root">
  <xsl:copy>
     <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

<xsl:template match="record">
  <record_data>
     <xsl:copy-of select="*"/>
     <xsl:for-each select="document('double2.xml')/root/record/policy[./PolicyNumber=current()/PolicyNumber]">
        <xsl:copy-of select="city|street"/>
     </xsl:for-each>
  </record_data>
</xsl:template>

</xsl:stylesheet>

<强>输出

<?xml version="1.0" encoding="UTF-8"?>
<root>
 <record_data>
  <PolicyNumber>1</PolicyNumber>
  <FirdsName>aa</FirdsName>
  <LastName>aa</LastName>
  <city>aaCity</city>
  <street>aaStreet</street>
 </record_data>
 <record_data>
  <PolicyNumber>2</PolicyNumber>
  <FirdsName>bb</FirdsName>
  <LastName>bb</LastName>
  <city>bbCity</city>
  <street>bbStreet</street>
 </record_data>
</root>

答案 1 :(得分:-1)

下面的内容对您有用。

注意:我没有运行此代码。在我检查not(policy)的地方,您可能会在xpath中进行一些更改,例如not(./policy)

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="Root/record">
    <xsl:choose>
    <xsl:when test="not(policy)">
      <record_data>
        <PolicyNumber><xsl:value-of select="PolicyNumber"/></PolicyNumber>
        <FirdsName><xsl:value-of select="FirdsName"/></FirdsName>
        <LastName><xsl:value-of select="LastName"/></LastName>
        <city><xsl:value-of select="city"/></city>
        <street><xsl:value-of select="street"/></street>
      </record_data>
    </xsl:when>
    <xsl:otherwise>
    </xsl:otherwise>
       <record_data>
        <PolicyNumber><xsl:value-of select="policy/PolicyNumber"/></PolicyNumber>
        <FirdsName><xsl:value-of select="policy/FirdsName"/></FirdsName>
        <LastName><xsl:value-of select="policy/LastName"/></LastName>
        <city><xsl:value-of select="policy/city"/></city>
        <street><xsl:value-of select="policy/street"/></street>
      </record_data>
    </xsl:choose>
</xsl:for-each>