使用XSLT创建具有属性名称的标记

时间:2014-06-22 19:54:18

标签: xml xslt xpath

我正在将xml文件转换为带有xforms的html,我想在xforms模型中插入一个带有属性名称的新标签(用XPath提取)。

基本上我有这个XML:

<structure>
   <part class='Button' id="b0"/>            
   <part class="Button" id="b1"/> 
   <part class="TextBox" id="t1"/>
</structure>

我想为xforms模型创建空标签作为实例元素。因此,我需要通过添加一个名为part属性的新空标记来声明具有类TextBox的{​​{1}} - 所以id。 我需要它作为XForms实例元素。 我写过以下XSLT,但我不确定我是否朝着正确的方向前进(尝试使用转义<t1/>&gt;

&lt;

也许,这是微不足道的,但我无法理解它......提前致谢!

更新: 最终结果应该是:

<xsl:template match="/">
    <html>
        <head>
            <xf:model id="model{position()}">
                <xf:instance id="formData{position()}">                        
                    <xsl:choose>
                        <xsl:when test="part[@class='TextBox']">
                            <xsl:for-each select="part[@class='TextBox']">
                                <xsl:element name="textBox">
                                    &gt;
                                    <xsl:value-of select="{@id}"/>
                                    &lt;
                                </xsl:element>
                            </xsl:for-each>                                
                        </xsl:when>
                    </xsl:choose>
                </xf:instance>
            </xf:model>
        </head>
        <body>
            <xsl:apply-templates/>
        </body>
    </html>
</xsl:template>

1 个答案:

答案 0 :(得分:1)

要生成<t1>元素,您可以使用<xsl:element>

 <xsl:element name="{@id}"/>

除非您在某个祖先元素中定义了默认命名空间(例如:<data xmlns="">),否则您可能无法生成<html xmlns="html-namespace">。然后你可以直接把它写到结果树:

<data xmlns="">
    <xsl:element name="{@id}"/>
</data>

您的模板在/中创建了一个上下文,该上下文没有<part>个孩子。您可以将所有内容放在与structure匹配的模板中,也可以在包含structure的表达式中将part添加为父选择器:

<xsl:when test="structure/part[@class='TextBox']">
    <xsl:for-each select="structure/part[@class='TextBox']"> ...

这应该可以让你产生你期望的结果。