与XPATH不断增加的模式定义到每个节点

问题描述:

创建的XML数字签名我有一个简单的XML与我公司签订使用XPath查询在XML喜欢// * [@ isDigSignReqd =“真”。现在,签名的XML包含像与XPATH不断增加的模式定义到每个节点

xmlns="http://www.xyze.org/xservice" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

连接到每一个节点的属性。 XML签名验证发生得很好。但是,我可以删除这些属性。 我很新的XML签名和一切。请帮忙。

这是XML的样子(部分)


<?xml version="1.0" encoding="UTF-8"?><XService xmlns="http://www.xyzbe.org/xservice" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.xyzbe.org/xservice ACPDTLRequest.xsd"> 
<request xmlns="http://www.xyzbe.org/xservice" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <header xmlns="http://www.xyzbe.org/xservice" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <BANK_ID isDigSignReqd="true" xmlns="http://www.xyzbe.org/xservice" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">DBS</BANK_ID> 
    <LANGUAGE_ID isDigSignReqd="true" xmlns="http://www.xyzbe.org/xservice" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">001</LANGUAGE_ID> 
    <CHANNEL_ID isDigSignReqd="true" xmlns="http://www.xyzbe.org/xservice" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">I</CHANNEL_ID> 
    <LOGIN_FLAG isDigSignReqd="true" xmlns="http://www.xyzbe.org/xservice" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">2</LOGIN_FLAG> 

变换都是这样产生。

final XPathFilter2ParameterSpec xp2Spec = new XPathFilter2ParameterSpec(
Collections.singletonList(new XPathType("//*[@isDigSignReqd='true']", XPathType.Filter.INTERSECT))); 
List<Transform> transforms = new ArrayList<Transform>() { 
    private static final long serialVersionUID = 1L; 
     { 
    add(sigFactory.newTransform(Transform.ENVELOPED, (TransformParameterSpec) null)); 
    add(sigFactory.newTransform(Transform.XPATH2, xp2Spec)); 
     } }; 

+0

好问题,+1。查看我的答案获取完整的解决方案。 :) – 2011-02-28 17:05:06

现在,签名的XML包含 属性,如

xmlns="http://www.xyze.org/xservice" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

连接到每一个节点。 XML 签名验证正常发生。但是, 我可以删除这些属性。

是,所提供的XML文档是相同的:

<XService xsi:schemaLocation="http://www.xyzbe.org/xservice ACPDTLRequest.xsd" 
      xmlns="http://www.xyzbe.org/xservice" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <request> 
    <header> 
     <BANK_ID isDigSignReqd="true">DBS</BANK_ID> 
     <LANGUAGE_ID isDigSignReqd="true">001</LANGUAGE_ID> 
     <CHANNEL_ID isDigSignReqd="true">I</CHANNEL_ID> 
     <LOGIN_FLAG isDigSignReqd="true">2</LOGIN_FLAG> 
    </header> 
    </request> 
</XService> 

说明

默认命名空间是有效的后代元素的所有名称和不需要在他们指定。

如何摆脱不必要的命名空间节点或声明的?

下面是一个简单的XSLT溶液,使用恒等变换:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

当这个变换所提供的XML文档施加(校正为进行良好的形成):

<XService xmlns="http://www.xyzbe.org/xservice" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.xyzbe.org/xservice ACPDTLRequest.xsd"> 
    <request xmlns="http://www.xyzbe.org/xservice" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <header xmlns="http://www.xyzbe.org/xservice" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
      <BANK_ID isDigSignReqd="true" xmlns="http://www.xyzbe.org/xservice" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">DBS</BANK_ID> 
      <LANGUAGE_ID isDigSignReqd="true" xmlns="http://www.xyzbe.org/xservice" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">001</LANGUAGE_ID> 
      <CHANNEL_ID isDigSignReqd="true" xmlns="http://www.xyzbe.org/xservice" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">I</CHANNEL_ID> 
      <LOGIN_FLAG isDigSignReqd="true" xmlns="http://www.xyzbe.org/xservice" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">2</LOGIN_FLAG> 
     </header> 
    </request> 
</XService> 

结果是

<XService xsi:schemaLocation="http://www.xyzbe.org/xservice ACPDTLRequest.xsd" 
      xmlns="http://www.xyzbe.org/xservice" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <request> 
    <header> 
     <BANK_ID isDigSignReqd="true">DBS</BANK_ID> 
     <LANGUAGE_ID isDigSignReqd="true">001</LANGUAGE_ID> 
     <CHANNEL_ID isDigSignReqd="true">I</CHANNEL_ID> 
     <LOGIN_FLAG isDigSignReqd="true">2</LOGIN_FLAG> 
    </header> 
    </request> 
</XService> 
+0

Dimitre你好,非常感谢您的回复。对不起,我把这个问题搞错了。我的意思是说,我如何删除名称空间声明。默认情况下签名的XML就是这样的。有什么办法可以删除每个节点上的声明,并将它们添加到父节点或根节点上?因为在签名过程中会写入任何属性或一行代码,这些属性或代码行会使这些属性消失。请告诉我。 – Sunny 2011-03-01 04:50:25

+0

@Sunny:我编辑了我的答案,现在它包含一个简单的XSLT转换,它生成等效的XML文档,其中除顶部元素外,所有元素都被剥离了名称空间声明。 – 2011-03-01 05:29:01

+0

谢谢..这有助于。我想知道如果我可以创建一个变换,并将这种变换添加到变换列表来完成这项工作。 – Sunny 2011-03-01 10:08:52