转换可识别架构的样式表

时间:2019-07-02 12:51:50

标签: xslt xsd saxon

我有一个模式识别的XSLT转换效果很好。但是,XSLT的预期用户可能无法访问模式感知处理器。因此,我想编写一些代码,将我的模式感知XSLT转换为XSLT,以供符合基本级别的处理器使用。

出于我的目的,使用模式感知结构仅限于匹配模板,即 <xsl:template match="element(*, Candidate)">...</>

我不希望这是一个全自动的过程。我想生成一个XSLT,对于complexType中的每个XSD,可以在指定的浮出水面的XSD element中找到其用途。 / p>

示例代码:

<xsd:schema xmlns="example.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="example.xsd" elementFormDefault="qualified" version="0.0">
    <xsd:element name="Candidate" type="Candidate"/>
    <xsd:complexType name="Candidate">
        <xsd:sequence>
            <xsd:element name="Code" type="Code" minOccurs="0" maxOccurs="unbounded"/>
            <xsd:element name="Name" type="xsd:string" minOccurs="0"/>
            <xsd:element name="PartyId" type="Code" minOccurs="0"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="Code">
        <xsd:sequence>
            <xsd:element name="Value" type="xsd:string"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>

元素Candidate的预期输出如下:

<complexType_usages>
  <usage complexType="Code" path="Candidate/Code" />
  <usage complexType="Code" path="Candidate/Party" />
</complexType_usages>

1 个答案:

答案 0 :(得分:0)

从经过验证的实例中进行工作,而不是尝试分析架构(只要实例具有足够的代表性),可能是最简单的。对于每个元素,输出类型注释(使用saxon:type-annotation)和路径,然后获取类型/路径对的列表,并消除重复和冗余。