我有以下XML
<Category>
<CD></CD>
<Books>
<Book Sold="Y">Program C</Book>
<Book Sold="Y" LessCost="Y">Maths-Yeshwant</Book>
<Book>Test</Book>
</Books>
</Category>
OutputExpected适用于以上输入:
出售的书籍是ProgramC,Maths-Yeshwant,LessCost Books是数学 - Yeshwant
(如果不存在Sold属性,则只显示第二个语句LessCost Books是Maths-Yeshwant
如果不存在Less Cost,则只显示第一个声明已售出的书籍为ProgramC
如果两个属性都不存在则输出必须为空)
我试过的代码在下面并且失败了。这是从书本级写的
<xsl:for-each select="Books/Book">
<xsl:variable name="SoldBooks" select="''"/>
<xsl:variable name="LessCostBooks" select="''"/>
<xsl:text>Sold Books are</xsl:text>
<xsl:for-each select="Books/Book">
<xsl:choose>
<xsl:when test="@Sold='Y'">
<xsl:value-of select="concat($SoldBooks,text(),',')">
</xsl:choose>
</xsl:for-each>
<xsl:text>Less Cost Books are</xsl:text>
<xsl:for-each select="Books/Book">
<xsl:choose>
<xsl:when test="@LessCost='Y'">
<xsl:value-of select="concat($LessCostBooks,text(),',')">
</xsl:choose>
</xsl:for-each>
</xsl:for-each>
有人可以让我知道我哪里出错,因为我是初学者。我还需要使用XSLT 1.0进行翻译
答案 0 :(得分:2)
您的输入XML和XSLT中存在一些错误
输入XML:<Category>
和<Books>
缺少相应的结束标记,</Test>
应为</Book>
。
XSLT:<xsl:foreach select="Books/Book">
应为<xsl:for-each select="Books/Book">
,而<xsl:when>
中的<xsl:choose>
都缺少结束</xsl:when>
。
对于更正的输入XML
<Category>
<CD></CD>
<Books>
<Book Sold="Y">Program C</Book>
<Book Sold="Y" LessCost="Y">Maths-Yeshwant</Book>
<Book>Test</Book>
</Books>
</Category>
遵循XSLT
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" doctype-public="XSLT-compat"
omit-xml-declaration="yes" encoding="UTF-8" indent="no" />
<xsl:strip-space elements="*"/>
<xsl:template match="Books">
<xsl:if test="Book[@Sold='Y']">
<xsl:text>Sold Books are </xsl:text>
<xsl:for-each select="Book[@Sold='Y']">
<xsl:value-of select="."/>
<xsl:if test="position()!= last()">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:if>
<xsl:if test="Book[@LessCost='Y']">
<xsl:if test="Book[@Sold='Y']">
<xsl:text>, </xsl:text>
</xsl:if>
<xsl:text>Less Books are </xsl:text>
<xsl:for-each select="Book[@LessCost='Y']">
<xsl:value-of select="."/>
<xsl:if test="position()!= last()">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
产生输出
Sold Books are Program C, Maths-Yeshwant, Less Books are Maths-Yeshwant
XSLT中的一个误解是更改变量的方法,这在XSLT中是不可能的。有关XSLT中变量的更多信息,您可以查看,例如: http://www.dpawson.co.uk/xsl/sect2/N8090.html