将两个XSLT模板合二为一

时间:2013-11-25 10:55:22

标签: xml templates xslt

任何人都可以帮助我。

我在下面有这个XML

<?xml version="1.0" encoding="utf-8"?>
<Document>
  <TopLevel>
    <Header>
      <Start>
        <ID>
          <Public> <!-- or Private-->
            <Name>Org Name</Name>
            <Address>Org Address</Address>
          </Public>
        </ID>
      </Start>
    </Header>
  </TopLevel>
</Document>

<ID>代码之后我可以<Public><Private>

我在下面有这个XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">

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

  <xsl:template match="/">
    <TopLevel>
      <xsl:apply-templates select="Document/TopLevel/Header"/>
    </TopLevel>
  </xsl:template>

  <xsl:template match="Header">
    <Start>
      <xsl:if test="Start/ID/Public/Name!=''">
        <xsl:value-of select="."/>
      </xsl:if>
      <xsl:if test="Start/ID/Private/Name!=''">
        <xsl:value-of select="."/>
      </xsl:if>
    </Start>
  </xsl:template>

  <xsl:template match ="Start/ID/Public/Name">
    <ID>
      <Public>
        <Name>
          <xsl:value-of select="." />
        </Name>
      </Public>
    </ID>
  </xsl:template>

  <xsl:template match ="Start/ID/Private/Name">
    <ID>
      <Private>
        <Name>
          <xsl:value-of select="." />
        </Name>
      </Private>
    </ID>
  </xsl:template>
</xsl:stylesheet>

我的问题是,我可以将最后两个模板合二为一,这样我只会调用输入XML中显示的一个模板吗?

1 个答案:

答案 0 :(得分:3)

目前您还没有应用 中为公共或私人定义的两个模板。您确实可以组合这两个模板,例如:

  <xsl:template match="Header">
    <Start>
      <xsl:apply-templates select="Start/ID/*/Name"/>
    </Start>
  </xsl:template>

  <xsl:template match ="Start/ID/*/Name">
    <ID>
      <!-- choose element name dynamically based on its parent -->
      <xsl:element name="{name(..)}">
        <Name>
          <xsl:value-of select="." />
        </Name>
      </xsl:element>
    </ID>
  </xsl:template>

但最好使用一种完全不同的方法解决问题 - 你没有在问题中提供所需的输出,但从这些模板的外观来看,它与输入非常相似,但有一些元素被删除或重命名。这些“最小编辑”类型的转换的一个好方法是从“标识模板”开始,该模板将输入复制到输出不变,但随后为某些元素覆盖此行为以进行所需的更改。如果在Stack Overflow上搜索“身份模板XSLT”,你会发现很多这种技术的例子。