XSLT文件-for-each函数出现问题

时间:2019-03-03 16:30:14

标签: xml xslt

我有一个类似于以下文件:

  <catalog>
    <cd0>
        <title>Empire Burlesque</title>
        <artist>Bob Dylan</artist>
        <country>USA</country>
        <company>Columbia</company>
        <price>10.90</price>
        <year>1985</year></cd0>
    <cd1>
        <title>Empire Burlesque</title>
        <artist>Bob Dylan</artist>
        <country>USA</country>
        <company>Columbia</company>
        <price>10.90</price>
        <year>1985</year>
    </cd1>
    <cd2>
        <title>Empire Burlesque</title>
        <artist>Bob Dylan</artist>
        <country>USA</country>
        <company>Columbia</company>
        <price>10.90</price>
        <year>1985</year>
    </cd2>
    .
    .
    .
</catalog>

我想使用for-each函数提取节点<cd1><cd2><cd3>等的任何元素,但是我找不到方法....

能帮我吗?

1 个答案:

答案 0 :(得分:0)

大致猜测您要实现的目标,这里有一些评论:

XSLT中的循环元素很可能是处理XML标签的典型初学者方法。在XML中,您必须改变想法。这意味着不循环标记,而是应用适合特定路径(xpath)的模板。

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

  <xsl:template match="catalog">
    <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
      <head>
      </head>
      <body>
        <ul>
          <xsl:apply-templates />
        </ul>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="catalog/*">
    <li>
      <xsl:value-of select="title"/>
    </li>
  </xsl:template>
</xsl:stylesheet>

我添加了一个简单的示例,并在此处进行了一些解释:

  1. 您的根标记称为catalog,因此xslt处理器转到“我们在这里很酷”,并开始应用适合-> catalog的模板。
  2. 然后输入那些示例html标签,直到遇到apply-templates
  3. 它将寻找模板cd0cd1,并最终找到适合目录的所有子节点(*)的模板。 (并且为了完整起见添加了标题。)
  4. 希望这可以帮助您前进。不确定是否正在生成该xml-layout,但是该数字不应成为标记名称的一部分。更好:

    <cd id="0"> ... </cd>

为什么更好?您可以更轻松地搜索。在这里检查索引:

  <xsl:template match="cd[@id='1']">
    <li>
      <xsl:value-of select="title"/>
    </li>
  </xsl:template>

在这里检查年份:

  <xsl:template match="cd[year/.&gt;1985]">
    <li>
   <xsl:value-of select="title"/>
    </li>
  </xsl:template>

学习xsl,您会发现它“产生了太多的输出”。这是因为应用了默认模板,该模板复制遍历的xml标记并将其转储到生成的输出中。我通常会添加一个空的默认模板,它不会写任何内容,因此您拥有完全的控制权。

<xsl:template match="*">

</xsl:template>

对您和遇到的任何人的其他提示: node()与*相同,而令人困惑的

<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>

仅表示:

将此模板用于每个属性(@)节点或(|)每个标记节点(*或node()),并将此节点复制到输出文档中,以递归方式应用并因此迭代源文档。注释标签将被忽略。

希望这可以使每个新手都能获得提升!一旦您知道如何使用它,它实际上就非常酷而且非常有效