xslt:递归使用模板时的多个副本输出

时间:2017-11-22 14:19:38

标签: xslt

关注此问题XSLT: Copy child elements of a complex type only once,我在使用该模板时出现问题。

假设我有这样的结构:

        <complexType name="InvoiceType">
          <xs:element name="AdressIn"      type="AdressType"/>
          <xs:element name="AdressOut"     type="AdressType" />
          <xs:element name="Partner"       type="PartnerType" />
          <xs:element name="Date"          type="DateType"/>
        </complexType>

        <complexType name="AdressType">
          <xs:element name="Person"      type="PersonType"/>
          <xs:element name="City"        type="string" />
          <xs:element name="Nr"          type="int" />
        </complexType>

        <complexType name="PartnerType">
          <xs:element name="Person"      type="PersonType"/>
          <xs:element name="Age"         type="int"/>
        </complexType>

        <complexType name="PersonType">
          <xs:element name="Name"        type="string"/>
        </complexType>

这个模板:

<xsl:template match="xs:complexType" mode="copy">
  <xsl:apply-templates select="/xs:schema/xs:complexType[@name=current()/xs:sequence/xs:element/@type]"        
  <xsl:copy-of copy-namespaces="no"  select="."></xsl:copy-of>        
</xsl:template>

我正在尝试使用此模板复制所有引用的complexType。我现在的问题是,PersonType 由AdressType和PartnerType引用(参见示例)。在我的outputfile中,此类型打印两次。 (简化示例)

我该如何解决这个问题?

Thanx任何帮助!

1 个答案:

答案 0 :(得分:0)

你真的想做什么?

(1)显示架构文档中的所有复杂类型? (这很简单)。

(2)显示从某处实际引用的所有全局复杂类型?

你可以做到

select(//xs:complexType[@name = //xs:element/@type])

(在名称空间存在的情况下,它不正确,但您的原始名称不正确)

(3)在第一次遇到某种图遍历时显示复杂类型,但后来没有?

这更难,并涉及一些相当艰难的递归编码。

通常,从源XSD文件访问架构信息很困难;你想要处理“野外任何模式”的越多越难,而不是只按照你编写它们的方式编写的一些模式。可能值得退一步,并询问这项工作的目的是什么。