XPath, получение значения атрибута min - PullRequest
1 голос
/ 22 октября 2011

ТАК Я никогда раньше не использовал XSLT, и я использовал XPath только в его самой простой форме.У меня есть элемент XML "Земля" с двумя атрибутами выносливости и силы воли.Оба содержат числа.Я пытаюсь отобразить рядом со словом «Земля» значение наименьшего из этих атрибутов.Я не могу понять, как вызывать функции в XPath.

Вот мой XSLT

    <?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:fn="http://www.w3.org/2005/xpath-functions"
  version="2.0">
  <!--<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    -->

  <xsl:output method="html" indent="yes"/>

  <xsl:template match="/">
    <html>
      <body>
        <xsl:apply-templates select="//Rings"/>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="//Rings">
    <h2>Rings</h2>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th>Earth</th>
        <th>
          <xsl:value-of select="fn:min(fn:number(Earth/@*))"/>
        </th>
      </tr>
      </tr>
    </table>
  </xsl:template>
</xsl:stylesheet>

Ответы [ 3 ]

2 голосов
/ 22 октября 2011

MS Visual Studio поставляется в комплекте с процессором .NET XSLT XslCompiledTransform, и это процессор XSLT 1.0.

С другой стороны, min() - это стандартная функция в XPath 2.0, а не в XPath 1.0. XSLT 1.0 использует только XPath 1.0.

Решение проблемы XSLT 1.0 :

<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="Earth">
     <xsl:value-of select=
      "@*[not(. > ../@*)][1]"/>
 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к следующему документу XML (поскольку вы его не предоставили!):

<Rings>
 <Earth stamina="3" willpower="6"/>
</Rings>

желаемый, правильный результат получается :

3

В .NET можно использовать сторонний процессор XSLT 2.0, такой как Saxon.NET или XQSharp. Ниже представлено решение XSLT 2.0:

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="Earth">
     <xsl:sequence select="min(@*)[1]"/>
 </xsl:template>
</xsl:stylesheet>
2 голосов
/ 22 октября 2011

Также обратите внимание, что min(number(@*)) неверно в XPath 2.0 - вы не можете применить функцию number () к последовательности узлов, чтобы получить последовательность чисел.Это должно быть min(@*/number()).Тем не менее, если входные данные не проверены, все атрибуты будут иметь нетипизированный атрибут, а функция min () автоматически преобразует значения нетипизированного атома в числа.Однако, если есть атрибуты, которые не являются числовыми, автоматическое преобразование вызовет ошибку, в то время как использование number () сгенерирует значение NaN, что приведет к тому, что результат min () также будет равен NaN.Если вы хотите минимальное значение всех этих числовых атрибутов, попробуйте min(@*[. castable as xs:double]).

0 голосов
/ 22 октября 2011

Функция min() доступна только в XSLT 2.0. Вам следует попробовать использовать процессор 2.0 ( Saxon ).

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