Как проверить, всегда ли значение узла в xml-файле берется из значения другого узла исправления с помощью xsl/xslt?

#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>