【问题标题】:XPath to get max child element based on attributeXPath 根据属性获取最大子元素
【发布时间】:2012-09-30 15:58:24
【问题描述】:

我需要编写一个 XPath 来获取具有最大年份的子元素的名称。

这是我的 XSLT 来获取它,但问题是我需要先调用一个模板将年份格式化为数字。

<xsl:value-of select="reports/report[not(preceding-sibling::report/@year &gt;= @year) 
and not(following-sibling::report/@year &gt; @year)]/name" />

示例 XML:

<reports>
   <report year="2012 Q4">
     <name>X</name>
   </report>
   <report year="2011 Q4">
     <name>Y</name>
   </company>
</reports>

预期输出:X。

【问题讨论】:

    标签: xslt xpath


    【解决方案1】:

    只需将每个比较表达式包装到substring-before( ... , ' ')

    【讨论】:

      【解决方案2】:

      这是另一种方法,它仍然包含提取年份编号的代码,但避免了冗长的复杂兄弟检查

      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
         <xsl:output method="xml" indent="yes"/>
      
         <xsl:template match="/">
            <xsl:for-each select="reports/report">
               <xsl:sort select="substring-before(@year, ' ')" data-type="number" order="descending" />
               <xsl:if test="position() = 1">
                  <xsl:value-of select="name" />
               </xsl:if>
            </xsl:for-each>
         </xsl:template>
      </xsl:stylesheet>
      

      方法是简单地将元素按顺序排序,但只输出第一个的值。

      在您的示例 XML 上使用时,输出应为 X

      【讨论】:

      • 如果@year 需要更多格式怎么办?如何在选择中调用模板?在 xstl 1.0 中
      • 您不能在选择中调用模板,您必须使用 xpath 函数,或者可能是扩展函数。这取决于您要执行的格式设置,但如果我们能够提供帮助,您确实需要展示更合适的示例。谢谢。
      • 我还不知道格式化函数的实现,但我想知道如何从该代码中调用模板/函数/任何内容
      • 在这种情况下您不能调用命名模板,但您可以调用 xapth 或扩展函数。是否可以提供一个稍微大一点的 XML 示例,显示您需要格式化的不同类型的年份,然后也许可以确定最佳方法。谢谢。
      猜你喜欢
      • 2020-04-22
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-27
      • 1970-01-01
      相关资源
      最近更新 更多