Чтение значения XML на основе атрибута - PullRequest
1 голос
/ 31 января 2011

У меня есть XML-файл, как показано ниже:

<?xml version="1.0" encoding="utf-8" ?> 
<?xml-stylesheet type="text/xsl" href="XSLFILE.xslt"?>
<books>
  <book ISBN="0321173481" author="Michael R. Sweet" >Book1</book>
  <book ISBN="0849371643" author="Gerald Farin" >Book2</book>
  <book ISBN="A558606696" author="David Rogers" >Book3</book>
  <book ISBN="1568810849" author="Gerald Farin" >Book4</book>
</books>

Я хочу получить название книги (book1 / book2 / book3 / book4) на основе значения атрибута (ISBN или автор), используя XSLT.

Предположим, если я напишу ISBN = 0321173481, тогда я должен получить значение: book1.

Кто-нибудь может мне помочь?

Спасибо

Ответы [ 2 ]

2 голосов
/ 31 января 2011

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:param name="pISBN" select="0321173481"/>
 <xsl:param name="pAuthor" select="'David Rogers'"/>

 <xsl:template match="/">
  <xsl:value-of select="/*/*[@ISBN=$pISBN]"/>
  =====
  <xsl:value-of select="/*/*[@author=$pAuthor]"/>
 </xsl:template>
</xsl:stylesheet>

при применении к исправленной версии вашего сильно искаженного псевдо-XML :

<books>
    <book ISBN="0321173481" author="Michael R. Sweet"
    >Book1</book>
    <book ISBN="0849371643" author="Gerald Farin"
    >Book2</book>
    <book ISBN="A558606696" author="David Rogers"
    >Book3</book>
    <book ISBN="1568810849" author="Gerald Farin"
    >Book4</book>
</books>

дает два желаемых и правильных результата :

  Book1
  =====
  Book3

Обратите внимание , что это не вопрос XSLT, а вопрос XPath.

0 голосов
/ 31 января 2011

Вы можете найти название книги с указанным ISBN следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:s="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"
    exclude-result-prefixes="msxsl">
  <xsl:output method="text"/>

  <!-- find a book with a certain isbn -->
  <xsl:template match="book[@ISBN=0321173481]">
    <!-- output the name -->
    <xsl:value-of select="."/>
  </xsl:template>

  <!-- visit all the documen nodes -->
  <xsl:template match="@*|node()">
    <xsl:apply-templates select="@*|node()"/>
  </xsl:template>

</xsl:stylesheet>

Это приведет к выводу текстового файла только с названием выбранной книги.Конечно, вы можете установить значение ISBN '0321173481', синтаксис для передачи этого зависит от вашего языка.

Однако, если все, что вы хотите сделать, это выбрать название книги с данным ISBN,XSLT на самом деле не самая лучшая технология, XSLT предназначен для преобразования документов XML, а не для простых запросов.

Для примера вы можете найти книгу с указанным ISBN с использованием Linq to XML следующим образом:

var name = document.Descendants("book")
                   .Where(book => book.Attribute("ISBN").Value == "2")
                   .Single().Value;

Намного проще!

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