XSLT测试任何孩子的价值

时间:2017-10-09 15:32:02

标签: xml xslt xpath

如果xml消息包含modtime大于某个值的任何对象,我需要测试它。目前,我使用一个样式表明确列出要测试的xml中的每个路径。

<xsl:if test="(translate(proot_modtime,'-T:Z','')>=translate('2017-09-30T00:00:45','-T:Z','')) 
      or (translate(a/a/pa_modtime,'-T:Z','')>=translate('2017-09-30T00:00:45','-T:Z','')) 
      or  (translate(b/b/pb_modtime,'-T:Z','')>=translate('2017-09-30T00:00:45','-T:Z','')) 
      ">
  <xsl:copy>
    <xsl:copy-of select="./@*"/>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:if>

当xml消息发生变化时,我倾向于忘记更新样式表。这就是为什么我正在寻找更通用的选择。这将查找包含单词 modtime 的所有子节点,并应检查所有这些节点。我尝试使用XPath Expression,匹配所有Modtime-Nodes

<xsl:if test="(translate(//*[ends-with(name(), '_modtime')],'-T:Z','')>=translate('2017-09-30T00:00:45','-T:Z',''))">       <xsl:copy>
    <xsl:copy-of select="./@*"/>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:if>

不幸的是,上面的代码片段只会测试第一个* _modtime节点并忽略所有其他节点。其实我想测试所有

有人有任何想法,在XSL中描述以下内容: “如果XML树中的任何modtime节点包含的值大于x,则复制整个xml”

示例XML:

<root>
  <proot_modtime>2017-09-28T00:00:00</proot_modtime>
  <a>
    <a>
      <pa_modtime>2017-10-01T16:15:15</pa_modtime>
    </a>
  </a>
  <b>
    <b>
      <pb_modtime>2017-09-30T00:00:00</pb_modtime>
    </b>
  </b>
</root>

完成XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" omit-xml-declaration="yes" indent="no"/>
  <xsl:template match="root">
    <xsl:if test="(translate(//*[ends-with(name(), '_modtime')],'-T:Z','')>=translate('2017-09-30T00:00:45','-T:Z',''))">
      <xsl:copy>
        <xsl:copy-of select="./@*"/>
        <xsl:apply-templates/>
      </xsl:copy>
    </xsl:if>
  </xsl:template>
  <xsl:template match="*">
    <xsl:copy>
      <xsl:copy-of select="./@*"/>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet> 

1 个答案:

答案 0 :(得分:0)

我想你只想要

<xsl:if test="//*[ends-with(name(), '_modtime')][translate(.,'-T:Z','')>=translate('2017-09-30T00:00:45','-T:Z','')]">