关于XSL转换的for-each出错

时间:2013-10-08 15:46:59

标签: xml xslt

我有一个关于XSL和XML的问题。 我需要在下面的例子中写'1'和'2':

XSL:

<xsl:for-each select="bodytext/artigo">
 <xsl:choose>
 <xsl:when test="@tip = '1'">
   <h2>1</h2>
 </xsl:when>
 <xsl:when test="@tip = '2'">
   <h2>2</h2>
 </xsl:when>
 <xsl:otherwise>
  <h2>3</h2>
 </xsl:otherwise>

    

XML:

<utilizador>Manuel</utilizador>
<sex>M</sex>
<artigo tip='1'>
    <nome>A Mentira Sagrada</nome>
    <price>12.99</price>
    <iva>23 %</iva>
    <link>9c6af52790</link>
</artigo>
<artigo tip='2'>
    <nome>A Mentira Sagrada</nome>
    <price>12.99</price>
    <iva>23 %</iva>
    <link>u8Jp06blGQkKxdEbkoT0</link>
</artigo>

我只打印'1',我需要打印'1'和'2'。

额外信息: 我现在明白这个问题与'&amp;'有关标志。如果我使用'&amp;'获得以下XML签署它不起作用。如果我删除它有效,但我需要它。

<bodytext>
    <utilizador>Criador Intelectual</utilizador>
    <sex>M</sex>
 <artigo tip='1'>
        <nome>A Mentira Sagrada</nome>
        <price>12.99</price>
        <iva>23 %</iva>
        <link>http://q-ebooks.com.pt/fulfillment/URLLink.acsm?action=enterorder&</link>
     </artigo>
 <artigo tip='2'>
        <nome>A Mentira Sagrada</nome>
        <price>12.99</price>
        <iva>23 %</iva>
        <link>teste2</link>
     </artigo>
</bodytext>

1 个答案:

答案 0 :(得分:0)

您应该包含整个输入XML文件(或其最小子集显示意外行为)。在不知道输入文件的情况下,这是一个黑暗中的镜头:尝试更改XPath以包含所有artigo元素作为完整性检查:

<xsl:for-each select="//artigo">
...

如果这导致打印的不仅仅是'1',我们可以根据需要帮助您收紧XPath(但请包含更多的XML输入文件)。

每次更新问题:使用&amp;代替'&amp;'。原始'&amp;'不能在XML中使用,因为它通常用于引入实体。要逃避此用途并包含实际的&符号,请改用&amp;

每秒更新一次问题:让我们看一下大局:

此XSLT转换:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <root>
      <xsl:for-each select="bodytext/artigo">
        <xsl:choose>
          <xsl:when test="@tip = '1'">
            <h2>1</h2>
          </xsl:when>
          <xsl:when test="@tip = '2'">
            <h2>2</h2>
          </xsl:when>
          <xsl:otherwise>
            <h2>3</h2>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each>
    </root>
  </xsl:template>
</xsl:stylesheet>

应用于此输入XML文件:

<bodytext>
  <utilizador>Criador Intelectual</utilizador>
  <sex>M</sex>
  <artigo tip='1'>
    <nome>A Mentira Sagrada</nome>
    <price>12.99</price>
    <iva>23 %</iva>
    <link>http://q-ebooks.com.pt/fulfillment/URLLink.acsm?action=enterorder&amp;</link>
  </artigo>
  <artigo tip='2'>
    <nome>A Mentira Sagrada</nome>
    <price>12.99</price>
    <iva>23 %</iva>
    <link>teste2</link>
  </artigo>
</bodytext>

产生此输出文件:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <h2>1</h2>
   <h2>2</h2>
</root>