任何人都可以帮助我。
我在下面有这个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中显示的一个模板吗?
答案 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”,你会发现很多这种技术的例子。