在不同的上下文中调用具有相同匹配字符串

时间:2016-09-12 15:15:31

标签: xslt

我想将源xml转换为目标xml,其中源xml的某些匹配包含在目标xml的不同上下文中。例如,我有一个源xml,如:

<shiporder>
  <shipto>orderperson1</shipto>
  <shipto>orderperson1</shipto>
  <city>London</city>
</shiporder>

在这个源xml上,我应用以下样式表:

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

  <xsl:template match="/">
     <xsl:call-template name="root" />
  </xsl:template>

  <xsl:template name="root">
    <root>
        <xsl:apply-templates select="/shiporder"/>
        <xsl:call-template name="Customer"/>
    </root>
</xsl:template>

 <xsl:template name="Customer">
    <Customer>
        <!--<xsl:apply-templates select="/shiporder"/>-->
    </Customer>
</xsl:template>

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

 <xsl:template match="/shiporder/shipto">
    <Address>
        <xsl:apply-templates select="text()"/>
    </Address>
 </xsl:template>
</xsl:stylesheet>

在名称Customer的模板中,我喜欢应用如下模板:

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

 <xsl:template match="/shiporder/city">
    <City>
        <xsl:apply-templates select="text()"/>
    </City>
 </xsl:template>

但我已经定义了一个匹配/shiporder的模板。所以我不知道如何设计样式表,其中两个具有相同匹配的模板都存在于他们自己的上下文中?

1 个答案:

答案 0 :(得分:0)

如果您使用模式,如@ michael.hor257k建议您可以区分两个或多个匹配相同元素但结果不同的模板。

在你的情况下,最终看起来像这样:

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

  <xsl:template match="/">
     <xsl:call-template name="root" />
  </xsl:template>

  <xsl:template name="root">
    <root>
        <xsl:apply-templates select="/shiporder" mode="root"/>
        <xsl:call-template name="Customer"/>
    </root>
</xsl:template>

 <xsl:template name="Customer">
    <Customer>
        <xsl:apply-templates select="/shiporder" mode="customer"/>
    </Customer>
</xsl:template>

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

  <xsl:template match="/shiporder" mode="customer">
 <xsl:apply-templates select="city"/>
 </xsl:template>

 <xsl:template match="shipto">
    <Address>
        <xsl:apply-templates select="text()"/>
    </Address>
 </xsl:template>

  <xsl:template match="city">
    <City>
        <xsl:apply-templates select="text()"/>
    </City>
 </xsl:template>

</xsl:stylesheet>

显然,这里的所有学分都是迈克尔首先指出这一点。