Xml 检查节点集在XSLT中是否包含任何值
我需要一些XSLT语法方面的帮助。这里是我的场景,我有一个XML文件,需要转换成不同的XML文件外观,我有几个部分,如果特定的节点集不包含任何值,那么整个部分就不应该被处理 以下是XML的一个示例:Xml 检查节点集在XSLT中是否包含任何值,xml,xslt,Xml,Xslt,我需要一些XSLT语法方面的帮助。这里是我的场景,我有一个XML文件,需要转换成不同的XML文件外观,我有几个部分,如果特定的节点集不包含任何值,那么整个部分就不应该被处理 以下是XML的一个示例: <Dates> <Date> <VALUE1></VALUE1> <VALUE2></VALUE2> <VALUE3></VALUE3>
<Dates>
<Date>
<VALUE1></VALUE1>
<VALUE2></VALUE2>
<VALUE3></VALUE3>
<VALUE4></VALUE4>
<VALUE5>3333</VALUE5>
</Date>
<Date>
<VALUE1>AAAA</VALUE1>
<VALUE2></VALUE2>
<VALUE3>JJJJ</VALUE3>
<VALUE4></VALUE4>
<VALUE5>12345</VALUE5>
</Date>
</Dates>
3333
AAAA
JJJJ
12345
下面是我的XSLT和if语句,它们不能正常工作
<xsl:for-each select="Level1/Level2/Level3">
<xsl:if test="@VALUE1!=''">
<MyDates>
<value_1>
<xsl:value-of select="VALUE1"/>
</value_1>
<value_2>
<xsl:value-of select="VALUE2"/>
</value_2>
<value_3>
<xsl:value-of select="VALUE3"/>
</value_3>
<value_4>
<xsl:value-of select="VALUE4"/>
</value_4>
</MyDates>
</xsl:if>
</xsl:for-each>
如您所见,我基本上希望所有节点(VALUE1、VALUE2、VALUE3等)都有值,否则不进行处理,继续下一节
(如果您看不到XML,我还做了一个屏幕截图)您正在尝试将XML元素与名称“Level1”、“Level2”等匹配。。。文档中不存在的。然后,在最后一个元素上查找VALUE1属性 我想你想要这样的东西:
<xsl:for-each select="Dates">
<MyDates>
<xsl:for-each select="Date">
<xsl:if test="not(*[.=''])">
<MyDate>
<value_1>
<xsl:value-of select="VALUE1"/>
</value_1>
<value_2>
<xsl:value-of select="VALUE2"/>
</value_2>
<value_3>
<xsl:value-of select="VALUE3"/>
</value_3>
<value_4>
<xsl:value-of select="VALUE4"/>
</value_4>
</MyDate>
</xsl:if>
</xsl:for-each>
</MyDates>
</xsl:for-each>
这将添加一个新的MyDate元素,只要相应的Date元素中的每个值都不是空的
它的作用是
*
匹配所有子项<代码>[.='']表示“为空”。最后,它将所有这些都封装在一个not中。这意味着只有当没有任何子级为空时,if才会通过您可能还需要查看W3Schools和教程。该@是多余的-它指的是XML属性 您正在尝试测试某个元素,因此只需删除@ 此外:
- Level1/Level2/Level3是错误的
- 您只测试VALUE1,但希望测试所有值(可以使用*)
- 您没有很好地定义“节点有价值”的含义
<强>最有可能的是,您将考虑一个元素,该元素只有一个空白的文本子,不具有值。 在这种情况下,以下是一种解决方案:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <Dates> <Date> <VALUE1></VALUE1> <VALUE2> </VALUE2> <VALUE3></VALUE3> <VALUE4></VALUE4> <VALUE5>3333</VALUE5> </Date> <Date> <VALUE1>AAAA</VALUE1> <VALUE2>1</VALUE2> <VALUE3>JJJJ</VALUE3> <VALUE4>1</VALUE4> <VALUE5>12345</VALUE5> </Date> </Dates> <Date> <VALUE1>AAAA</VALUE1> <VALUE2>1</VALUE2> <VALUE3>JJJJ</VALUE3> <VALUE4>1</VALUE4> <VALUE5>12345</VALUE5> </Date>
如果“日期”元素包含一个子元素,且该子元素没有内容或只有空白,则该“日期”元素的模板将不匹配
当此转换应用于以下XML文档时:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<Dates>
<Date>
<VALUE1></VALUE1>
<VALUE2> </VALUE2>
<VALUE3></VALUE3>
<VALUE4></VALUE4>
<VALUE5>3333</VALUE5>
</Date>
<Date>
<VALUE1>AAAA</VALUE1>
<VALUE2>1</VALUE2>
<VALUE3>JJJJ</VALUE3>
<VALUE4>1</VALUE4>
<VALUE5>12345</VALUE5>
</Date>
</Dates>
<Date>
<VALUE1>AAAA</VALUE1>
<VALUE2>1</VALUE2>
<VALUE3>JJJJ</VALUE3>
<VALUE4>1</VALUE4>
<VALUE5>12345</VALUE5>
</Date>
3333
AAAA
1.
JJJJ
1.
12345
生成正确的结果:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<Dates>
<Date>
<VALUE1></VALUE1>
<VALUE2> </VALUE2>
<VALUE3></VALUE3>
<VALUE4></VALUE4>
<VALUE5>3333</VALUE5>
</Date>
<Date>
<VALUE1>AAAA</VALUE1>
<VALUE2>1</VALUE2>
<VALUE3>JJJJ</VALUE3>
<VALUE4>1</VALUE4>
<VALUE5>12345</VALUE5>
</Date>
</Dates>
<Date>
<VALUE1>AAAA</VALUE1>
<VALUE2>1</VALUE2>
<VALUE3>JJJJ</VALUE3>
<VALUE4>1</VALUE4>
<VALUE5>12345</VALUE5>
</Date>
AAAA
1.
JJJJ
1.
12345
我想你也可以这样做。而不是检查节点。VALUE1/text()将检查节点中是否包含一些文本。您可能需要确保这些文件没有空白。此外,您还可以查看VALUE1元素是否有子节点
<xsl:if test="VALUE1/text()">
</xsl:if>
<xsl:if test="VALUE1/child::node()">
</xsl:if>
名字无效
价值1
价值2
价值3
价值4
价值5
您的XSLT没有通过。如果您还包括一个示例输出,可能会吗?@Alex:您现在有两个很好的答案:Chris Marasti Georg的和Dimitre的