Цифровая подпись XML, созданная с помощью XPATH, продолжает добавлять определение схемы к каждому узлу - PullRequest
1 голос
/ 28 февраля 2011

У меня есть простой 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 ));
        } };

1 Ответ

0 голосов
/ 28 февраля 2011

Теперь подписанный 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>
...