XSLT用键选择多个元素

时间:2014-11-12 07:56:36

标签: xml xslt

我的XML文件看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<XML>   
    <Forms name = "Form1">
        <Form ID='allowed'></Form>
        <Form ID='mandatory'></Form>
        <Form ID='not_allowed'></Form>
        <Form ID='choose'></Form>
    </Forms>
    <Forms name = "Form2">
        <Form ID='mandatory'></Form>
        <Form ID='not_mandatory'></Form>
        <Form ID='not_mandatory'></Form>
        <Form ID='not_mandatory'></Form>
    </Forms>
</XML>

我想知道所有包含允许或强制使用ID的表单的表单:

<XML>   
    <Forms name = "Form1">
        <Form ID='allowed'></Form>
        <Form ID='mandatory'></Form>
    </Forms>
    <Forms name = "Form2">
        <Form ID='mandatory'></Form>
    </Forms>
</XML>

到目前为止我所拥有的:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />

<xsl:variable name="Form" select = "'allowed'"/>
<xsl:key name="get_Forms_by_ID" match="Forms" use="Form/@ID"/>

<xsl:template match="/XML">
    <xsl:apply-templates/>  
</xsl:template>

<xsl:template  match="Forms">
    <xsl:copy-of select="key('get_Forms_by_ID', $Form)"></xsl:copy-of>
</xsl:template>

我的问题是如何使用多值变量$ Form:key或mandatory来使用键函数。

1 个答案:

答案 0 :(得分:2)

(对于XSLT 2.0)将变量定义为序列

<xsl:variable name="Form" select = "('allowed', 'mandatory')"/>

编辑:

对于XSLT 1.0,您可以使用:

<xsl:copy-of select="key('get_Forms_by_ID', 'allowed') | key('get_Forms_by_ID', 'mandatory')"/>

如果您需要首先在变量中预定义键值,则必须使用EXSLT node-set()扩展函数将它们转换为节点集,然后才能在(单个)键中使用它们()呼叫。