#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. ДА… вот и все — когда я добавил весь путь в шаблон, я получил то, что хотел. Спасибо за ценный вклад! 🙂