Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 检查节点集在XSLT中是否包含任何值_Xml_Xslt - Fatal编程技术网

Xml 检查节点集在XSLT中是否包含任何值

Xml 检查节点集在XSLT中是否包含任何值,xml,xslt,Xml,Xslt,我需要一些XSLT语法方面的帮助。这里是我的场景,我有一个XML文件,需要转换成不同的XML文件外观,我有几个部分,如果特定的节点集不包含任何值,那么整个部分就不应该被处理 以下是XML的一个示例: <Dates> <Date> <VALUE1></VALUE1> <VALUE2></VALUE2> <VALUE3></VALUE3>

我需要一些XSLT语法方面的帮助。这里是我的场景,我有一个XML文件,需要转换成不同的XML文件外观,我有几个部分,如果特定的节点集不包含任何值,那么整个部分就不应该被处理

以下是XML的一个示例:

<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元素中的每个值都不是空的

它的作用是

  • 为每个Dates元素创建一个新的MyDates元素
  • 检查每个日期元素。
    *
    匹配所有子项<代码>[.='']表示“为空”。最后,它将所有这些都封装在一个not中。这意味着只有当没有任何子级为空时,if才会通过
  • 如果它没有空的子元素,它将创建一个新的MyDate元素,其中包含每个值的副本

  • 您可能还需要查看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的