用于选择特定节点的XSLT

时间:2012-06-18 09:33:13

标签: xml xslt xpath umbraco

我无法使用我使用XSLT创建的宏来获取数据。我有几个EventData个节点,我想从另一个Content文件夹中的页面访问。

我尝试了很多不同的查询(发布的内容太多),但我的最新查询在下面。当事件数据低于标准页面时,我有这个工作,但我已经将它们移动到自己的文件夹,并且无法成功更新XSLT。

XML:

<root id="-1">
  <HomeTemplate id="1055" parentID="-1" level="1">
    <ContentFolder id="1097" parentID="1055" level="2">
      <EventData id="1095" parentID="1097" level="3">
       <eventDate>2012-06-20T00:00:00</eventDate>
       <eventName>Event Name Data</eventName>
       <eventLocation>Event Location Data</eventLocation>
      </EventData>
    .......
    </ContentFolder>
    <ContentFolder id="1059" parentID="1055" level="2">
      <StandardTemplate id="1061" parentID="1059" level="3">
        <pageHeading>Results</pageHeading>
        .......
      </StandardTemplate>
    </ContentFolder>
  ......
  </HomeTemplate>
</root>

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#x00A0;"> ]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:param name="currentPage"/>
<xsl:template match="/">
  <table>
    <xsl:for-each select="EventData">
      <tr>
        <td>Event Date: <xsl:value-of select="umbraco.library:FormatDateTime(./eventDate, 'd')"/></td>
        <td>Event Name: <xsl:value-of select="./eventName"/></td>
        <td>Event Location: <xsl:value-of select="./eventLocation"/></td>
      </tr>
    </xsl:for-each>
  </table>
</xsl:template>
</xsl:stylesheet>

编辑:

<xsl:for-each select="umbraco.library:GetXmlNodeById(1097)/EventData">

以上是有效的,但理想情况下我希望能按类型选择,因此不需要硬编码。

2 个答案:

答案 0 :(得分:2)

旧架构

<xsl:for-each select="$currentPage/ancestor-or-self::node[@nodeTypeAlias='HomeTemplate']//node[@nodeTypeAlias='EventData']">
</xsl:for-each>

新架构

<xsl:for-each select="$currentPage/ancestor-or-self::HomeTemplate//EventData[@isDoc]">
</xsl:for-each>

请注意,此示例使用HomeTemplate的别名走到顶级节点/文档类型,因为我假设您使用的最顶级节点只有一个实例。

另请注意,这是一个相当昂贵的xPath调用,因为它走到树上以找到顶级节点,直到我们到达Home节点。然后,无论查找具有EventData别名的节点(文档类型)有多深,它都会查看所有子节点。

来源:http://our.umbraco.org/wiki/reference/xslt/45-xml-schema/xslt-examples-updated-to-new-schema

答案 1 :(得分:0)

您正在匹配文档的根(而不是节点“root”),然后查找节点“EventData”。在那个级别上不存在,唯一存在的是<root>

如果你想循环遍历EventData,你需要

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

<xsl:for-each select="root/HomeTemplate/ContentFolder/EventData">
...

因为eventData还有很长的路要走