2016-08-30 25 views
1

我是使用XSLT的初学者,因此我不确定这是否可行。我非常感谢你的帮助。在XSLT文件中引用XSD并匹配元素名称以获取元素类型

XSLT将从一种格式转换为另一种格式。 源XML没有该类型。

我需要引用XSD来获取给定元素的类型。

<match="*[not(*)]"> 
    <elementName> 
     <key> 
     <xsl:value-of select="name()"/> 
     </key> 
     <type> 
     if (name() matches name =id in xsd file" 
     // if name = id matches name = id in xsd get type=String 

     <type> 

这是样品XSD:

<xs:complexType name = "test"> 
    <xs:sequence 
    <xs:element name="id" type="xs:string"/> 
    </xs:sequence> 
    </xscomplexType> 
+0

你的问题太马虎了,不能回答。请发布**完整的XML,XSLT和XSD示例 - 请参阅:[mcve]。 - 同时说明您的XSLT处理器是否支持XSLT 2.0。 –

回答

1

使用XSLT 2.0模式感知的改造,你可以写:

<xsl:import-schema> 
    ... schema goes here, either inline or by reference ... 
</xsl:import-schema> 

<xsl:template match="element(id, xs:string)"> 
    ... 
</xsl:template> 

使用这种的方式,一般假定你写你的样式表知道模式中的内容。撒克逊通过扩展功能扩展了这一功能,可以让您发现模式中的内容。例如:

<xsl:variable name="type" select="saxon:type-annotation()"/> 
<key><xsl:value-of select="name()"/></key> 
<type>Q{<xsl:value-of select="namespace-from-QName($p)||"}"||local-name-from-QName($type)"/></type> 

见撒克逊:类型,注释和萨克森:架构扩展功能在http://www.saxonica.com/documentation/index.html#!functions/saxon

分析从XSLT模式文档直接是可能的理论,但它的工作的一个巨大的量来得到它对,如果你要处理诸如xs:include/import/redefine,命名类型和匿名类型,全局和本地元素声明,替换组等等。

另一种方法是分析可以从Saxon输出的XML格式(SCM)中的“预编译模式”,这消除了许多o这些困难。

其他产品还提供访问架构的API,但没有真正的标准。