xls:apply-template在从root选择的节点上

时间:2018-06-14 17:04:08

标签: xml xslt xsd

我正在尝试编写xsl转换以从xs架构创建html表单。我遇到的问题是当我在参考元素的模板中然后我需要应用元素树的其他分支中该元素定义的模板。这是一个例子:

match_parent

我要转换的架构:

<xsl:transform version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <!-- Root node -->
    <xsl:template match="//xs:element[@name='xmlRoot']">
        <form id="form">
            <xsl:apply-templates select="xs:complexType/xs:sequence/*" />
        </form>
        <br/>
    </xsl:template>

    <xsl:template match="xs:group[@ref]">
        <!-- Here I need to find the referenced group -->
        <xsl:apply-templates select="//xs:group[@name='{@ref}']" />
    </xsl:template>

    <xsl:template match="xs:group[@name]">
        <xsl:apply-templates select="xs:sequence/*" />
    </xsl:template>

</xsl:transform>

我开始匹配<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="xmlRoot"> <xs:complexType> <xs:sequence> <xs:group ref="basic-info-group"/> </xs:sequence> </xs:complexType> </xs:element> <xs:group name="basic-info-group"> <xs:sequence> <xs:element name="name" type="xs:string"/> </xs:sequence> </xs:group> </xs:schema> 元素架构中的模板,然后匹配其中的组以及组中我需要调用第二个模板的第一个模板。

2 个答案:

答案 0 :(得分:1)

应用第二阶段的XPath搞砸了。要更正它,请更改

<xsl:apply-templates select="//xs:group[@name='{@ref}']" />

<xsl:apply-templates select="//xs:group[@name=current()/@ref]" />

然后它使用第一个模板中的第二个模板 或者你可以使用像

这样的绝对路径
<xsl:apply-templates select="/xs:schema/xs:group[@name=current()/@ref]" />

答案 1 :(得分:0)

select="//xs:group[@name='{@ref}']"应为select="//xs:group[@name = current()/@ref]"或使用密钥<xsl:key name="group-ref" match="xs:group" use="@name"/>select="key('group-ref', @ref)"