选择多变量XSL中的第一个节点

时间:2011-06-17 19:43:51

标签: xml xslt

我对XSL有一些经验,但我现在需要的是比我的技能要高一点,而且我对如何处理它有点困惑。我也环顾了这个网站,并且不认为我找到了类似的东西......虽然我可能错了!

首先,这是我的页面生成的一些XML:

<root>
  <content>
    <Title>Title 1 here</Title>
    <Image>Image Link 1 here</Image>
    <Description>Description 1 here</Description>
    <Category>Special Exhibitions</Category>
    <Priority>2</Priority>
  </content>
    <content>
    <Title>Title 2 here</Title>
    <Image>Image Link 2 here</Image>
    <Description>Description 2 here</Description>
    <Category>Special Exhibitions</Category>
    <Priority>1</Priority>
  </content>
  <content>
    <Title>Title 3 here</Title>
    <Image>Image Link 3 here</Image>
    <Description>Description 3 here</Description>
    <Category>Live Music</Category>
    <Priority>9</Priority>
  </content>
    <content>
    <Title>Title 4 here</Title>
    <Image>Image Link 4 here</Image>
    <Description>Description 4 here</Description>
    <Category>Lecture</Category>
    <Priority>7</Priority>
  </content>
    <content>
    <Title>Title 5 here</Title>
    <Image>Image Link 5 here</Image>
    <Description>Description 5 here</Description>
    <Category>Special Exhibitions</Category>
    <Priority>3</Priority>
  </content>
    <content>
    <Title>Title 6 here</Title>
    <Image>Image Link 6 here</Image>
    <Description>Description 6 here</Description>
    <Category>Workshop</Category>
    <Priority>10</Priority>
  </content>
    <content>
    <Title>Title 7 here</Title>
    <Image>Image Link 7 here</Image>
    <Description>Description 7 here</Description>
    <Category>Special Exhibitions</Category>
    <Priority>6</Priority>
  </content>
</root>

基本上,每个<content>元素都有不同的子元素,包括<Category><Priority>

我的问题是我只想选择<Category=Special Exhibition>的第一个节点,按<Priority>排序,所以在这种情况下,“标题2”。

这是我到目前为止的XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/">  
        <xsl:apply-templates select="root/EventType/Type">
        </xsl:apply-templates>
      </xsl:template>

    <xsl:template match="Type">
      <xsl:variable name="categoryType" select="." />
      <xsl:apply-templates select="../../content[Category=$categoryType]">
    </xsl:apply-templates>

  </xsl:template>
<xsl:template match="/">
<xsl:for-each select="root/content">
      <xsl:sort data-type="number" order="ascending" select="Priority"/>
      <xsl:if test="(Category='Special Exhibitions')">
        <xsl:choose>
          <xsl:when test="(position()=1)">
            <div class="slide-container">
              <img style="margin-top:18px;" src="{BannerImage}" alt="{Title}" title="{Title}"/>
              <span>
                <xsl:attribute name="class">
                  <xsl:text>slide-caption</xsl:text>
                </xsl:attribute>
                <xsl:value-of select="Title"></xsl:value-of>
                <xsl:text> | </xsl:text>
                <xsl:value-of select="Date"></xsl:value-of>
              </span>
            </div>
          </xsl:when>
        </xsl:choose>
      </xsl:if>
    </xsl:for-each>

  </xsl:template>
</xsl:stylesheet>

显然我的问题出现在<xsl:if><xsl:when>部分的某个地方。这就是我的想法如何找到节点,但显然不是XSL的方式!任何人都可以给我一个关于如何攻击它的指针吗?

提前非常感谢 -

2 个答案:

答案 0 :(得分:2)

不要使用sort或when。使用xpath选择所需的节点:

<xsl:template match="/">
  <xsl:for-each select="/root/content
                        [Category = 'Special Exhibitions']
                        [Priority = min(/root/content[Category =
                                                     'Special Exhibitions']/Priority)]
                        [1]">
    <div class="slide-container">
      <img style="margin-top:18px;" src="{BannerImage}" alt="{Title}" title="{Title}"/>
      <span class="slide-caption">
        <xsl:value-of select="concat(Title, ' | ', Date)"/>
      </span>
    </div>
</xsl:for-each>

或者,使用XPath 1.0:

<xsl:for-each select="/root/content
                      [Category = 'Special Exhibitions']
                      [not(Priority &gt; /root/content[Category =
                                                       'Special Exhibitions']/Priority)]
                      [1]">

答案 1 :(得分:1)

不知道你实际得到的结果,而不是你想要的结果,我会说改变这些行:

<xsl:for-each select="root/content">
      <xsl:sort data-type="number" order="ascending" select="Priority"/>
      <xsl:if test="(Category='Special Exhibitions')">
        <xsl:choose>
          <xsl:when test="(position()=1)">

<xsl:for-each select="root/content[Category='Special Exhibitions']">
      <xsl:sort data-type="number" order="ascending" select="Priority"/>
      <xsl:if test="position()=1">

我这样说是因为你要处理<Category=Special Exhibition>的第一个节点,按<Priority>排序,而你正在处理第一个节点(根/内容)节点按<Priority>排序,如果该节点恰好有<Category>=Special Exhibition

如果最低优先级内容不属于特殊展览类别,则原始代码不会输出任何内容。当然,您所展示的样本输入并非如此。但由于您没有告诉我们该样本的实际输出是什么,这是我根据可用数据进行的最佳猜测。