У меня есть особая проблема, которую я не могу решить.
Можно ли выбрать все узлы, используя xpath и xslt без использования дополнительных шаблонов или для каждого?
Пример xml:
<aaa id="11">
<aaa id="21"></aaa>
<bbb id="22">
<aaa id="31"></aaa>
<bbb id="32"></bbb>
<ccc id="33"></ccc>
<ddd id="34"></ddd>
<ddd id="35"></ddd>
<ddd id="36"></ddd>
</bbb>
<ccc id="23"></ccc>
<ccc id="24"></ccc>
</aaa>
Пользователь имеет возможность вводить выражение xpath через форму, например:
//aaa/bbb/ddd/@id
Пользователь ожидает получить идентификаторы из:
<ddd id="34"></ddd>
<ddd id="35"></ddd>
<ddd id="36"></ddd>
Вывод:
34 35 36
Единственный способ, которым я смог добиться этого, - это использовать дополнительные шаблоны и для каждого:
Для каждого пути:
<xsl:template match="/">
<html>
<body>
<xsl:for-each select="//aaa/bbb/ddd">
<tr>
<td>
<xsl:value-of select="@id" />
</td>
</tr>
</xsl:for-each>
</body>
</html>
</xsl:template>
Дополнительный способ шаблона:
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="//aaa/bbb/ddd">
<xsl:value-of select="@id"/>
</xsl:template>
Каждый из этих примеров требует дополнительной работы для отделения @id от исходного выражения.Я хотел бы использовать введенное пользователем выражение как есть и просто подключить его куда-нибудь.
Я пробовал следующее, которое, как я думал, выберет все, но оно возвращает только первый экземпляр:
<xsl:template match="/">
<html>
<body>
<xsl:value-of select="//aaa/bbb/ddd/@id"/>
</body>
</html>
</xsl:template>
Есть ли решение моей проблемы (то есть способ просто вставить введенное пользователем выражение как есть?)
РЕДАКТИРОВАТЬ: Примечание - мне нужно решение, которое будет работать с любымВыражение xpath, данное пользователем ... независимо от того, насколько оно сложное.
Дайте мне знать, если вам понадобятся какие-либо дополнительные разъяснения .. Я старался изо всех сил, чтобы объяснить это, но, возможно, я не оченьхорошо .. Заранее спасибо за ваше терпение!
Спасибо!:)