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
无法删除标记,该标记为;xsi:nil";通过xslt在它们中_Xslt_Xml Nil - Fatal编程技术网

无法删除标记,该标记为;xsi:nil";通过xslt在它们中

无法删除标记,该标记为;xsi:nil";通过xslt在它们中,xslt,xml-nil,Xslt,Xml Nil,我有以下xml,其中包含几个xsi:nil=“true”的xml标记。这些标签基本上是空的。我无法使用/找到任何sxlt转换器来从xml中删除这些标记并获取xml的其余部分 <?xml version="1.0" encoding="utf-8"?> <p849:retrieveAllValues xmlns:p849="http://package.de.bc.a"> <retrieveAllValues> <messages

我有以下xml,其中包含几个xsi:nil=“true”的xml标记。这些标签基本上是空的。我无法使用/找到任何sxlt转换器来从xml中删除这些标记并获取xml的其余部分

<?xml version="1.0" encoding="utf-8"?>
<p849:retrieveAllValues xmlns:p849="http://package.de.bc.a">
    <retrieveAllValues>
        <messages xsi:nil="true" />
        <existingValues>
            <Values>
                <value1> 10.00</value1>
                <value2>123456</value2>
                <value3>1234</value3>
                <value4 xsi:nil="true" />
                <value5 />
            </Values>
        </existingValues>
        <otherValues xsi:nil="true" />
        <recValues xsi:nil="true" />
    </retrieveAllValues>
</p849:retrieveAllValues>

10
123456
1234

您得到的错误原因

[致命错误]file2.xml:5:30:与元素类型“messages”关联的属性“xsi:nil”的前缀“xsi”未绑定

如果声明缺少名为“xsi”的前缀,则应在根元素中指定它,例如:

<p849:retrieveAllValues xmlns:p849="http://package.de.bc.a"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<retrieveAllValues>
    <messages xsi:nil="true" />
       // other code...

//其他代码。。。
更新 如果您无法更改从webservice接收的xml文档,您可以尝试下一种方法(如果您可以接受这种方法):

  • xslt
    文档更改为在不指定元素前缀的情况下处理xml文档
  • 将的属性
    namespaceAware
    设置为false

  • 在此之后,您的transformer不应该抱怨,XSLT中似乎不可能出现这种情况-因为缺少名称空间声明,您必须使用不支持名称空间的解析器解析XML文件,但我尝试过的所有XSLT处理器都不能很好地处理此类文档,它们必须依赖于仅在启用名称空间感知的情况下进行解析时才显示的某些信息,即使相关文档实际上不包含任何名称空间节点

    因此,您必须以不同的方式进行处理,例如,您自己遍历DOM树。既然您说您使用的是Java,下面是一个使用Java DOM API的示例(该示例在控制台中按原样运行,或者将其封装在适当的类定义中,并添加作为Java运行所需的任何异常处理)

    import javax.xml.transform.*;
    导入javax.xml.transform.dom.*;
    导入javax.xml.transform.stream.*;
    导入javax.xml.parsers.*;
    导入org.w3c.dom.*;
    导入org.w3c.dom.ls.*;
    公共void stripNils(节点n){
    if(n)元素的实例&&
    “true”.equals((元素)n).getAttribute(“xsi:nil”)){
    //元素为xsi:nil-去掉它
    n、 getParentNode().removeChild(n);
    }否则{
    //我们保留这个节点,递归地处理它的子节点(如果有的话)
    NodeList childrends=n.getChildNodes();
    for(int i=0;i
    在原始示例XML上,这将生成正确的结果:

    <?xml version="1.0" encoding="UTF-8"?>
    <p849:retrieveAllValues xmlns:p849="http://package.de.bc.a">
        <retrieveAllValues>
    
            <existingValues>
                <Values>
                    <value1> 10.00</value1>
                    <value2>123456</value2>
                    <value3>1234</value3>
    
                    <value5/>
                </Values>
            </existingValues>
    
    
        </retrieveAllValues>
    </p849:retrieveAllValues>
    
    
    10
    123456
    1234
    

    空行实际上不是空的,它们包含已删除元素两侧的空白文本节点,因为此处仅删除元素本身。

    是否要从文档中删除所有具有属性的元素
    xsi:nil=“true”
    ?是。我希望删除其中包含xsi:nil=“true”的所有标记。我尝试了这个网站和其他网站上现有的几种XSLT,但没有一种对我有效。他们都给了我同样的错误,那就是“[Fatal error]file2.xml:5:30:与元素类型“messages”关联的属性“xsi:nil”的前缀“xsi”没有绑定。”我认为这在XSLT中根本不可能实现,我添加了一个答案,这个答案似乎是正确的。我现在看到了问题。一个mf my transformers的xml输入中没有架构。但我真的不知道如何在这里操作模式(在其中添加-xmlns:xsi=“”),以便在它到达转换器之前,将缺少的模式添加到它。@Anand,你没有看到什么?对不起,我不明白你的确切意思。您是否尝试添加此xmlns声明?您仍然有相同的错误吗?您的解决方案是正确的。但对我来说,这是一个不同的问题。我正在使用xslt转换的xml来自web服务调用。服务的响应转到xslt,xslt认为模式丢失,并正确地进行投诉。所以现在我想知道,我是否可以以及如何强制服务响应不忽略这个必需的模式。@Anand,你在使用java吗?有没有办法直接在xslt中进行操作?我真的不理解选项#1,其中您说“将xslt文档更改为在不指定元素前缀的情况下处理xml文档”。有没有一个例子可以参考?