与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));
} };
现在,签名的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>
Dimitre你好,非常感谢您的回复。对不起,我把这个问题搞错了。我的意思是说,我如何删除名称空间声明。默认情况下签名的XML就是这样的。有什么办法可以删除每个节点上的声明,并将它们添加到父节点或根节点上?因为在签名过程中会写入任何属性或一行代码,这些属性或代码行会使这些属性消失。请告诉我。 – Sunny 2011-03-01 04:50:25
@Sunny:我编辑了我的答案,现在它包含一个简单的XSLT转换,它生成等效的XML文档,其中除顶部元素外,所有元素都被剥离了名称空间声明。 – 2011-03-01 05:29:01
谢谢..这有助于。我想知道如果我可以创建一个变换,并将这种变换添加到变换列表来完成这项工作。 – Sunny 2011-03-01 10:08:52
好问题,+1。查看我的答案获取完整的解决方案。 :) – 2011-02-28 17:05:06