Question

J'ai un document XML.Je signes une partie de document en utilisant xmlsignature.Avant de trouver Digest, Je veux appliquer une transformation XSLT.










Selon ce que j'ai lu, XSLT convertit un document XML à un autre format (peut être XML également). maintenant je suis confus que, < où sera le nouveau document transformé est disponible?


Comment récupérer la valeur de ce document nouvellement créé si je veuxPour le montrer à l'utilisateur?

mon document XML

<r1>
 <user>asd</user>
 <person>ghi</person>
</r1>

code de transformation

Transform t=fac.newTransform(Transform.XPATH,new XPathFilterParameterSpec("/r1/user"));

Selon la transformation XPath, chaque fois que la valeur de l'élément utilisateur modifie la xmlsignature ne doit pas être validée.Et si la valeur de l'élément de la personne change, la signature doit être validée.Mais lorsque je change la valeur de l'élément de personne, la signature n'est pas validée.Pourquoi?

Était-ce utile?

La solution

La transformation XSLT utilisée lors de la signature d'un document concerne la sélection des nœuds de votre source XML lorsque la signature est calculée.

Cette question / réponse par Dave concerne la signature de parties d'un document XML à l'aide de XPATH2. Pour Sean Mullans 'Post dans cette réponse suggère que XPath2 est plus approprié pour la signature de parties d'un document car l'évaluation d'une expression XPath est effectuée par nœud.

SO basé sur le Sun DSIG Exemple Vous pouvez remplacer la référence référence en utilisant:

List<XPathType> xpaths = new ArrayList<XPathType>();
xpaths.add(new XPathType("//r1/user", XPathType.Filter.INTERSECT));

Reference ref = fac.newReference
  ("", fac.newDigestMethod(DigestMethod.SHA1, null),
        Collections.singletonList
          (fac.newTransform(Transform.XPATH2, 
                  new XPathFilter2ParameterSpec(xpaths))),
             null, null); 

Ceci permet // r1 / utilisateur à protéger avec une signature tandis que le reste du document peut être modifié.

Le problème avec la sélection XPATH / XPATH2 est qu'une signature peut être générée pour / certains / noeud / qui / ne contient / pas / n'existe pas . Vous avez raison de modifier un document de test et assurez-vous que la signature fonctionne comme vous vous attendez.

Vous pouvez tester le document dans un programme de test en générant une signature puis altération du nœud XML avant la vérification:

NodeList nlt = doc.getElementsByTagName("user");
nlt.item(0).getFirstChild().setTextContent("Something else");


Une alternative plus fiable à un sélecteur XPath peut être de mettre un identifiant sur les éléments de document XML que vous espérez signer comme:

<r1>
 <user id="sign1">asd</user>
 <person>ghi</person>
</r1>

Référencez cet identifiant comme URI dans le premier paramètre d'un transfert enveloppé:

Reference ref = fac.newReference
  ("#sign1", fac.newDigestMethod(DigestMethod.SHA1, null),
    Collections.singletonList
      (fac.newTransform(Transform.ENVELOPED,(TransformParameterSpec) null)),
          null, null); 


Pour la sortie, une opération de signature ajoute un nouvel élément de signature à la DOM que vous avez chargée en mémoire. Vous pouvez diffuser la sortie en le transformant comme ceci:

TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
trans.setOutputProperty(OutputKeys.INDENT, "yes");

trans.transform(new DOMSource(doc), new StreamResult(System.out)); 

Autres conseils

La spécification XSLT ne définit pas ce qui arrive au document de résultat;C'est défini par les spécifications de l'API de votre processeur XSLT choisi.Par exemple, si vous invoquez XSLT à partir de Java à l'aide de l'interface JAXP, vous pouvez demander le résultat sous forme d'arborescence DOM en mémoire ou pour qu'elle soit sérialisée à un fichier spécifié sur disque.

Vous avez étiqueté votre question "Java" qui est le seul indice que vous donnez à votre environnement de traitement.Je suppose que vous souhaitez transformer en un DOM, puis utiliser des interfaces DOM pour obtenir la valeur du nouveau document.Bien que si vous utilisez XSLT 2.0 et Saxon, l'interface S9API est beaucoup plus utilisable que l'interface JAXP native.

La partie XSLT ne définit que la définition de transformation, rien d'autre. Regardez ceci:

Tutoriel Java XSLT

dans francois gravier Réponse Le fichier INPUT.XML est le fichier qui sera transformé, la définition de Transform.xslt est la définition XSLT qui explique comment transformer le fichier XML.La sortie.out sont les résultats, cela peut être XML, mais il peut également être HTML, fichier plat ...

C'est là que j'ai commencé avec quand j'utilisais XSLT:

http://www.w3schools.com/xsl/default.asp

Regardez-y aussi:

http://www.w3schools.com/xsl/trynxslt.asp? xmlfile= CDCatalog & xsltfile= CDCatalog

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top