Xml 将两个XSLT模板组合在一个模板中
有人能帮我吗 我在下面有这个XMLXml 将两个XSLT模板组合在一个模板中,xml,templates,xslt,Xml,Templates,Xslt,有人能帮我吗 我在下面有这个XML <?xml version="1.0" encoding="utf-8"?> <Document> <TopLevel> <Header> <Start> <ID> <Public> <!-- or Private--> <Name>Org Name</Name&g
<?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>
组织名称
组织地址
在
标记之后,我可以期望有
或
下面是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中显示的一个模板?目前,您没有应用为公共或私有定义的两个模板中的任何一个。您确实可以组合这两个模板,例如:
<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>
但是,使用完全不同的方法解决问题可能会更好-您在问题中没有提供所需的输出,但从这些模板的外观来看,它与输入非常相似,但删除或重命名了一些元素。对于这些“最小编辑”类型的转换,一个很好的方法是从一个“标识模板”开始,该模板将输入复制到输出,但不做任何更改,然后覆盖某些元素的此行为,以进行所需的更改。如果您在堆栈溢出中搜索“identity template XSLT”,您将发现许多这种技术的示例。目前您没有应用为公共或私有定义的两个模板中的任何一个。您确实可以组合这两个模板,例如:
<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>
但是,使用完全不同的方法解决问题可能会更好-您在问题中没有提供所需的输出,但从这些模板的外观来看,它与输入非常相似,但删除或重命名了一些元素。对于这些“最小编辑”类型的转换,一个很好的方法是从一个“标识模板”开始,该模板将输入复制到输出,但不做任何更改,然后覆盖某些元素的此行为,以进行所需的更改。如果您在堆栈溢出中搜索“identity template XSLT”,您将发现许多这种技术的示例。目前您没有应用为公共或私有定义的两个模板中的任何一个。您确实可以组合这两个模板,例如:
<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>
但是,使用完全不同的方法解决问题可能会更好-您在问题中没有提供所需的输出,但从这些模板的外观来看,它与输入非常相似,但删除或重命名了一些元素。对于这些“最小编辑”类型的转换,一个很好的方法是从一个“标识模板”开始,该模板将输入复制到输出,但不做任何更改,然后覆盖某些元素的此行为,以进行所需的更改。如果您在堆栈溢出中搜索“identity template XSLT”,您将发现许多这种技术的示例。目前您没有应用为公共或私有定义的两个模板中的任何一个。您确实可以组合这两个模板,例如:
<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上搜索“identity template XSLT”,您会发现许多这种技术的示例。谢谢Ian,这正是我需要的,因为我有一个更深的嵌套,我发布的只是一个示例,但您的解决方案正是我需要完成的:)谢谢Ian,这正是我需要的,因为我有一个更深的嵌套,我发布的只是一个示例,但您的解决方案正是我需要完成的:)谢谢Ian,正是我需要的,因为我有一个更深的嵌套,我发布的只是一个示例,但您的解决方案正是我需要完成的:)谢谢Ian,正是我需要的,因为我有一个更深的嵌套,我发布的只是一个示例,但您的解决方案正是我需要完成的:)