在1.0中连接XSLT值

时间:2014-11-30 16:59:48

标签: xml xslt xslt-1.0

我有以下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进行翻译

1 个答案:

答案 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