Тест XSL на множестве узлов? - PullRequest
0 голосов
/ 19 мая 2011

У меня есть набор «файловых» узлов с атрибутом типа

<files>
    <file type="main">asdf</file>
    <file type="main_en">asdf</file>
    <file type="main_fr">asdf</file>
    <file type="pdf">asdf</file>
</files>

Как проверить набор файлов, если один из узлов имеет хотя бы 1 атрибут, начинающийся с «main». Я думал что-то вроде:

<xsl:when test="contains(string(files/file[@type]),'main')">

Но все известные мне функции или тесты, похоже, предназначены только для определенного узла, а не для набора узлов. Я бы предпочел не использовать для каждого типа решения.

Ответы [ 3 ]

2 голосов
/ 20 мая 2011

Как проверить набор файлов, если один из узлов имеет хотя бы 1 атрибут, начинающийся с "main".

Использовать :

boolean(/*/file[@*[starts-with(., 'main')]])

Это вычисляется как true() точно, когда есть хотя бы один элемент file, который является дочерним элементом верхнего элемента документа XML и имеет хотя бы один атрибут, строковое значение которого начинается сстрока "main"

При использовании в атрибуте test (из <xsl:if> или <xsl:when>) или в качестве предиката ссылка на функцию boolean() не является необходимой и можетбыть опущенным :

/*/file[@*[starts-with(., 'main')]]
1 голос
/ 19 мая 2011
<xsl:when test="files/file[contains(@type, 'main')]">

Или, еще лучше:

<xsl:when test="files/file[starts-with(@type, 'main')]">
0 голосов
/ 20 мая 2011

Не знаю вашей реальной цели, но этот пример может вам помочь:

 <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/files">
        <xsl:if test="file[contains(@type,'main')]">
            There is at least one file element with 'main' in @type
        </xsl:if>
  </xsl:template>


</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...