使用xsl创建xml复合文档并在相同的xsl中添加前缀

时间:2017-04-30 21:27:48

标签: xml xslt

这不应该是这么复杂。我有两个xml文件,我需要用它们创建一个复合文档。

<!--cars.xml -->
<cars>
   <car cid="nes201">
      <title>Straight Away</title>
      <model>Nissan</model>
      <driver>indy</driver>
   </car>
   <car cid="gda100-5">      
      <title>Quick Start</title>
      <model>General Motors</model>
      <driver>indy</driver>      
   </car>
   <car cid="gma005-2">      
      <title>Stop Blocks Laps</title>
      <model>Ford</model>
      <driver>indy</driver>     
   </car>
</cars>
<!--teams.xml -->
<teams>
   <team tid="t205">
      <title>Rodas Motorsports</title>
      <description>#1 Team in racing</description>
      <series>Indy</series>
   </team>
   <team tid="t105">
      <title>SAM Racing</title>
      <description>Top 10 over last 5 years</description>
      <series>Nascar</series>
   </team>
</teams>

我需要在结果文档teamscars.xml中添加前缀并将它们组合在一起。 如下

<teamsCars>
    <crs:cars>
       <crs:car cid="nes201">
          <crs:title>Straight Away</crs:title>
          <crs:model>Nissan</crs:model>
          <crs:driver>indy</crs:driver>
       </crs:car>
       <crs:car cid="gda100-5">      
          <crs:title>Quick Start</crs:title>
          <crs:model>General Motors</crs:model>
          <crs:driver>indy</crs:driver>      
       </crs:car>
       <crs:car cid="gma005-2">      
          <crs:title>Stop Blocks Laps</crs:title>
          <crs:model>Ford</crs:model>
          <crs:driver>indy</crs:driver>     
       </crs:car>
    </crs:cars>
    <tms:teams>
       <tms:team tid="t205">
          <tms:title>Rodas Motorsports</tms:title>
          <tms:description>#1 Team in racing</tms:description>
          <tms:series>Indy</tms:series>
       </tms:team>
       <tms:team tid="t105">
          <tms:title>SAM Racing</tms:title>
          <tms:description>Top 10 over last 5 years</tms:description>
          <tms:series>Nascar</tms:series>
       </tms:team>
    </tms:teams>
</teamsCars>

我发现热添加前缀但我只能将其添加到一个文件而不是复制其余文件。希望有人能说清楚。这是我可以使用但却缺少的大部分内容。

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="xml" 
        omit-xml-declaration="yes" 
        indent="yes"/>
    <xsl:template match="node()|@*">    
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>     
    </xsl:template>
    <xsl:template match="*">
        <xsl:element name="crs:{name()}" namespace="http://example.com/cars">
            <xsl:copy-of select="namespace::*"/>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

如果要处理两个XML文件,则必须选择一个作为转换的输入,并通过document()函数读取另一个。下面是一个示例,其中cars.xml文件是正在处理的文件,teams.xml文件是“其他”文件:

XSLT 1.0

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

<xsl:template match="/">
    <teamsCars>
        <xsl:apply-templates mode="crs"/>
        <xsl:apply-templates select="document('teams.xml')" mode="tms"/>
    </teamsCars>
</xsl:template>

<xsl:template match="*" mode="crs">
    <xsl:element name="crs:{name()}" namespace="http://example.com/cars">
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates mode="crs"/>
    </xsl:element>
</xsl:template>

<xsl:template match="*" mode="tms">
    <xsl:element name="tms:{name()}" namespace="http://example.com/teams">
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates mode="tms"/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

假设您已为document()函数指定teams.xml文件的正确路径,结果将为:

<?xml version="1.0" encoding="UTF-8"?>
<teamsCars>
  <crs:cars xmlns:crs="http://example.com/cars">
    <crs:car cid="nes201">
      <crs:title>Straight Away</crs:title>
      <crs:model>Nissan</crs:model>
      <crs:driver>indy</crs:driver>
    </crs:car>
    <crs:car cid="gda100-5">
      <crs:title>Quick Start</crs:title>
      <crs:model>General Motors</crs:model>
      <crs:driver>indy</crs:driver>
    </crs:car>
    <crs:car cid="gma005-2">
      <crs:title>Stop Blocks Laps</crs:title>
      <crs:model>Ford</crs:model>
      <crs:driver>indy</crs:driver>
    </crs:car>
  </crs:cars>
  <tms:teams xmlns:tms="http://example.com/teams">
    <tms:team tid="t205">
      <tms:title>Rodas Motorsports</tms:title>
      <tms:description>#1 Team in racing</tms:description>
      <tms:series>Indy</tms:series>
    </tms:team>
    <tms:team tid="t105">
      <tms:title>SAM Racing</tms:title>
      <tms:description>Top 10 over last 5 years</tms:description>
      <tms:series>Nascar</tms:series>
    </tms:team>
  </tms:teams>
</teamsCars>

请注意,与您的问题中的输出不同,此问题包含将使用过的前缀绑定到实际命名空间URI的命名空间声明 - 正如格式良好的XML文档必须这样做。