从xpath构建节点

时间:2016-09-01 14:43:17

标签: xslt

我有一个源xml,从这个源xml我喜欢选择一个路径给出的节点,例如:来自示例来源的/shiporder/item/title/shiporder/shipto/name

<?xml version="1.0" encoding="utf-16"?>
<shiporder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" orderid="orderid1">
  <orderperson>orderperson1</orderperson>
  <shipto>
    <name>name1</name>
  </shipto>
  <item>
    <title>foo</title>
  </item>
  <item>
    <title>bar</title>
  </item>
</shiporder>

我喜欢将这些节点转换为某些目标树,例如源xml中的每个/shiporder/item/title都应复制到目标xml树中的root/Customer/Name/Title。所以我的想法是为源路径中的每个级别生成一个模板,并从前一级调用此模板:

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

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

  </xsl:template>

 <xsl:template match="/shiporder">
    <Customer>
        <xsl:apply-templates select="item"/>
        <xsl:apply-templates select="shipto"/>
    </Customer>
 </xsl:template>

<xsl:template match="/shiporder/item">
    <Name>
        <xsl:apply-templates select="title"/>
    </Name>
  </xsl:template>

  <xsl:template match="/shiporder/shipto">
    <Address>
        <xsl:apply-templates select="name"/>
    </Address>
  </xsl:template>

<xsl:template match="/shiporder/item/title">
    <Title>
      <xsl:value-of select="text()" />
    </Title>
</xsl:template>


<xsl:template match="/shiporder/shipto/name">
    <Street>
      <xsl:value-of select="text()" />
    </Street>
</xsl:template>

</xsl:stylesheet>

如果我有一个庞大的源路径列表,我会得到一个巨大的样式表。有一个更可行的想法来实现目标吗?

0 个答案:

没有答案