Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 将两个XSLT模板组合在一个模板中_Xml_Templates_Xslt - Fatal编程技术网

Xml 将两个XSLT模板组合在一个模板中

Xml 将两个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

<?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,正是我需要的,因为我有一个更深的嵌套,我发布的只是一个示例,但您的解决方案正是我需要完成的:)