我有一个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>
我希望使用XSLT获取基于属性值(ISBN或作者)的书名(book1 / book2 / book3 / book4)。
假设我写ISBN = 0321173481
,那么我应该得到价值:book1
。
有人能帮助我吗?
由于
答案 0 :(得分:2)
此转化:
<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问题。
答案 1 :(得分:-1)
您可以按如下方式找到具有给定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文档而设计,而非简单查询。
例如,您可以使用Linq to XML找到具有给定ISBN的书籍,如下所示:
var name = document.Descendants("book")
.Where(book => book.Attribute("ISBN").Value == "2")
.Single().Value;
更简单!