У меня есть простой XML, и я подписал XML с помощью запроса XPATH, например // * [@ isDigSignReqd = 'true'].Теперь подписанный XML содержит атрибуты, такие как
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 содержит атрибуты типа
прикреплено к каждому узлу. 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>
результат :