2

嘿,我刚开始学习 xslt 我遇到了问题。我有 xml 文件,如:

<projects>
<project nr="1">
<description>z</description>
<description>a</description>
</project>
</projects>

像这样的项目很少有描述,我想做的是创建一个 html 表,其中包含所有项目的所有排序描述。总的来说,如果我有 5 个项目和 2 个描述,那么将有 10 个排序的行。到目前为止,我已经设法对所有项目的第一个描述进行排序,不知道如何包含第二个以及是否会有第三个第四个等。有什么线索吗?感谢帮助。

@edit 到目前为止,我已经开始使用平面文件,但这没关系。到目前为止我有

<xsl:output method="text"/>
<xsl:template match="projects">
<xsl:apply-templates>
<xsl:sort select="description" />
</xsl:apply-templates>
</xsl:template>
<xsl:template match="project">
 Description: <xsl:apply-templates select="description"/>
<xsl:text>
 </xsl:text>
 </xsl:template>

我一直在搞乱 for:each 循环但是老实说我不确定应该怎么做

4

2 回答 2

0

这种转变:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

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

 <xsl:template match="/*">
  <xsl:copy>
   <xsl:apply-templates select="*/description">
    <xsl:sort/>
   </xsl:apply-templates>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

当应用于以下 XML 文档时(基于提供的和扩展的):

<projects>
    <project nr="1">
        <description>z</description>
        <description>a</description>
    </project>
    <project nr="2">
        <description>b</description>
        <description>y</description>
    </project>
    <project nr="3">
        <description>c</description>
        <description>x</description>
    </project>
    <project nr="4">
        <description>d</description>
        <description>w</description>
    </project>
    <project nr="5">
        <description>e</description>
        <description>u</description>
    </project>
</projects>

产生想要的结果

<projects>
   <description>a</description>
   <description>b</description>
   <description>c</description>
   <description>d</description>
   <description>e</description>
   <description>u</description>
   <description>w</description>
   <description>x</description>
   <description>y</description>
   <description>z</description>
</projects>
于 2013-03-18T01:09:58.620 回答
0

你是对的,你想使用一个 for-each 循环,像这样:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <xsl:for-each select="//project/description">
      <xsl:sort select="." />
      <xsl:copy-of select="."/>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

这将返回所有<description>项目中的所有节点,按升序排序。如果您想返回它们的非 xml 表示,您可以用或任何您喜欢的方式替换<xsl:copy-of select="."/>节点。Description: <xsl:value-of select="."/>

于 2013-03-18T01:10:42.783 回答