#xml #xslt
Вопрос:
Я проверяю некоторые условия в xml-файле, используя версию xsl/xslt 1.0. Для одной из проверок я должен убедиться, что значение узла может быть взято только из значения другого узла. Например:
sample.xml:
<fruit-garden>
<fruit-available>
<fruit>apple</fruit>
<fruit>banana</fruit>
</fruit-available>
<fruit-for-dinner>
<fruit>apple</fruit>[should-be-fine]
<fruit>mango</fruit>[should-not-be-fine]
</fruit-for-dinner>
</fruit-garden>
Здесь, в sample.xml предположим, что нам нужно /fruit-for-dinner/fruit
, чтобы значение было только одним из значений по /fruit-available/fruit
состоянию на XSLT 1.0, я не могу придумать метод для этого программирования.
Я подумал, может быть, set:разница может быть полезна здесь, но похоже, что она работает на фиксированном пути к узлу. Любой намек в правильном направлении будет полезен для меня.
Комментарии:
1. Вы не можете использовать
set:difference()
, потомуfruit-available/fruit
что иfruit-for-dinner/fruit
для начала два разных набора узлов. Вам нужно сравнить значения либо напрямую, либо — предпочтительно — с помощью ключа , как предлагается.
Ответ №1:
Используйте <xsl:key name="available-fruits" match="fruit-available/fruit" use="."/>
, а затем вы можете проверить, например <xsl:template match="fruit-for-dinner/fruit[not(key('available-fruits', .)]">not right</xsl:template>
.
Ответ №2:
Основываясь на вашем вопросе, вы можете использовать любую вариацию этих двух шаблонов, чтобы есть или нет. Создайте совпадение по ключу, а затем используйте его. Я сделал это немного подробным, чтобы показать два его использования (совпадают или нет).
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:key name="available" match="fruit-available/fruit" use="." />
<xsl:template match="/">
<garden>
<xsl:apply-templates select="fruit-garden"/>
</garden>
</xsl:template>
<xsl:template match="/fruit-garden">
<caneat>
<xsl:apply-templates select="fruit-for-dinner/fruit[key('available', .)]"/>
</caneat>
<bob-ate-it>
<xsl:apply-templates select="fruit-for-dinner/fruit[not(key('available', .))]"/>
</bob-ate-it>
</xsl:template>
<xsl:template match="fruit">
<eatme>
<xsl:value-of select="."/>
</eatme>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
Пример вывода
<?xml version="1.0" encoding="UTF-8"?>
<garden>
<caneat>
<eatme>apple</eatme>
<eatme>pear</eatme>
</caneat>
<bob-ate-it>
<eatme>mango</eatme>
</bob-ate-it>
</garden>