Используйте XSLT для создания тега с именем атрибута

#xml #xslt #xpath

#xml #xslt #xpath

Вопрос:

Я преобразую XML-файл в html с помощью xforms one и хочу вставить новый тег внутри модели xforms с именем атрибута (извлеченного с помощью XPath).

В основном у меня есть этот XML:

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

И я хочу создать только пустые теги для модели xforms в качестве элементов экземпляра. Итак, мне нужно объявить part класс, у которого есть класс TextBox , добавив новый пустой тег с именем id атрибута — so <t1/> .
Мне это нужно как элемент экземпляра XForms.
Я написал следующий XSLT, но я не уверен, что я в правильном направлении (пытаюсь с помощью escape amp;> и amp;< )

 <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">
                                    amp;>
                                    <xsl:value-of select="{@id}"/>
                                    amp;<
                                </xsl:element>
                            </xsl:for-each>                                
                        </xsl:when>
                    </xsl:choose>
                </xf:instance>
            </xf:model>
        </head>
        <body>
            <xsl:apply-templates/>
        </body>
    </html>
</xsl:template>
  

Возможно, это тривиально, но я не могу разобраться в этом.. Заранее спасибо!

ОБНОВЛЕНИЕ: конечный результат должен быть:

 .....
<head>
   <xf:model>
      <xf:instance>
         <data xmlns="">
            <t1/>
         </data>
      </xf:instance>
   </xf:model>
</head>
.....
  

Ответ №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']"> ...
  

Это должно позволить вам сгенерировать ожидаемый результат.

Комментарии:

1. ДА… вот и все — когда я добавил весь путь в шаблон, я получил то, что хотел. Спасибо за ценный вклад! 🙂