开发者

XML Digital Signature created with XPATH keeps adding schema definition to every node

I have a simple XML and i signed the XML using XPATH query like //*[@isDigSignReqd = 'true']. Now, the signed XML contains the attributes like

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

attached to every node. The XML signature validation occurs fine. But, can I remove these attributes. I'm pretty new to XML signing and all that. Please help.

This is how the XML looks like (part)


<?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>

Transforms are created like this.

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 ));
        } };


Now, the signed XML contains the attributes like

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

attached to every node. The XML signature validation occurs fine. But, can I remove these attributes.

Yes, the provided XML document is equivalent to this:

<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>

Explanation:

The default namespace is in force on all names of descendent elements and doesn't need to be specified on them.

How to get rid of the unnecessary namespace nodes or declarations?

Here is a simple XSLT solution, using the identity transformation:

<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>

when this transformation is applied on the provided XML document (corrected to be made well-formed):

<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>

the result is:

<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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜