如果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>
答案 0 :(得分:0)
我想你只想要
<xsl:if test="//*[ends-with(name(), '_modtime')][translate(.,'-T:Z','')>=translate('2017-09-30T00:00:45','-T:Z','')]">