Domanda

Ho un documento XML. Sto firmando una parte del documento usando xmlsignature.Prima di trovare digest, voglio applicare la trasformazione XSLT.


Secondo ciò che ho letto, XSLT converte un documento XML in un altro formato (può essere anche XML). Ora sono confuso che,
Dove sarà il nuovo documento trasformato è Avilable?

Come recuperare il valore da questo documento appena creato se voglioper mostrarlo all'utente?

My XML Document

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

Codice per trasformazione

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

Secondo la trasformazione XPath, ogni volta che il valore dell'elemento utente cambia la XMLSignatura non deve essere convalidata.E se il valore dell'elemento della persona cambia quindi la firma deve essere convalidata.Ma quando cambio il valore dell'elemento della persona, la firma non viene convalidata.Perché?

È stato utile?

Soluzione

La trasformazione XSLT utilizzata quando si firma un documento si riferisce a come sono selezionati i nodi nella sorgente XML quando viene calcolata la firma.

Questa domanda / risposta di Dave si riferisce alle parti di firma di un documento XML utilizzando XPath2. The Link Per Sean Mullans 'post in questa risposta suggerisce XPath2 è più appropriato per la firma di parti di un documento poiché la valutazione di un'espressione XPath viene eseguita per nodo.

Così basato su Sun DSIG Esempio Puoi sostituire la creazione Reference utilizzando:

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

Ciò consente // R1 / Utente da proteggere con una firma mentre il resto del documento può essere modificato.

Il problema con la selezione XPath / XPath2 è che è possibile generare una firma per / alcuni / nodo / che / non / non / esistono . Hai ragione per modificare un documento di prova e assicurati che la firma funzioni nel modo in cui ti aspetti.

È possibile testare il documento in un programma di test generando una firma, quindi manomissione con il nodo XML prima della verifica:

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


Un'alternativa più affidabile a un selettore XPath potrebbe essere quella di mettere un ID sugli elementi del documento XML che speri di firmare come:

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

Quindi fare riferimento a questo ID come URI nel primo parametro di un trasferimento avvolto:

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


Per l'uscita, un'operazione di firma aggiunge un nuovo elemento di firma al DOM che hai caricato in memoria. Puoi scorrere l'output trasformandolo come questo:

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

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

Altri suggerimenti

La specifica XSLT non definisce ciò che accade al documento dei risultati;Questo è definito dalle specifiche API del tuo processore XSLT scelto.Ad esempio, se si invoca XSLT da Java utilizzando l'interfaccia JAXP, è possibile richiedere il risultato come un albero DOM in memoria o per essere serializzato a un file specificato su disco.

Hai taggato la tua domanda "Java" che è l'unico indizio che dai al tuo ambiente di lavorazione.La mia ipotesi è che si desidera trasformare in un DOM e quindi utilizzare le interfacce DOM per ottenere il valore dal nuovo documento.Sebbene se si utilizza XSLT 2.0 e Saxon, l'interfaccia S9API è molto più utilizzabile rispetto all'interfaccia JAXP nativa.

La parte XSLT definisce solo la definizione della trasformazione, nient'altro. Dai un'occhiata a questo:

Esercitazione Java XSLT

In Francois Ghel risponde al file input.xml è il file che verrà trasformato, Transform.xslt è la definizione XSLT che descrive come trasformare il file XML.output.out I risultati sono i risultati, questo potrebbe essere XML, ma può anche essere HTML, file piatto ...

È qui che ho iniziato con quando stavo usando XSLT:

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

Dai un'occhiata anche a questo:

http://www.w3schools.com/xsl/tryxslt.sp? xmlfile= cdcatalog & xsltfile= cdcatalog

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top