Pergunta

Eu tenho um documento XML.Eu sou a assinatura de uma parte de um documento usando xmlsignature.Antes de encontrar digest, Eu quero aplicar transformação XSLT.

De acordo com o que eu li, XSLT converte um Documento XML para outro formato(pode ser XML também). Agora estou confuso que,
onde vai ser transformada em novo documento está disponível?

Como recuperar o valor deste documento recém-criado se eu quero mostrar para o usuário?

Meu Documento XML

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

Código para Transformação

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

De acordo com o xpath transformação,Sempre que o valor do elemento usuário altera o xmlsignature não deve ser validado.E se a pessoa valor do elemento de alterações, em seguida, a Assinatura deve ser validado.Mas quando eu mudar de pessoa valor do elemento a assinatura não é validado.POR quê?

Foi útil?

Solução

A transformação xslt usado durante a assinatura de um documento refere-se a como nós a sua fonte XML são selecionadas quando a assinatura é calculada.

Esta pergunta/resposta por Dave relaciona-se com a assinatura de partes de um documento XML usando xpath2.O link para Sean Mullans' post esta resposta sugere xpath2 é mais apropriado para a assinatura de partes de um documento, vez que a avaliação de uma expressão xpath é feito por nó.

Assim, com base no sol dsig exemplo você pode substituir o Referência criação usando:

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

Isso permite que //r1/usuário para estar protegido com uma assinatura, enquanto o resto do documento pode ser alterado.

O problema com o xpath/xpath2 de seleção é que uma assinatura pode ser gerado para /alguns/node/que/não/não/existir.Você está certo para modificar um documento de teste e certifique-se de que a assinatura está trabalhando da maneira que você espera.

Você pode testar o documento em um programa de teste por gerar uma assinatura em seguida, adulteração com o nó xml antes de verificação:

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


Mais confiável alternativa para um xpath seletor pode ser para colocar um ID no documento xml elementos de esperança para assinar como:

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

em seguida, fazer referência a esta IDENTIFICAÇÃO como a URI no primeiro parâmetro de um envolto de transferência:

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


Para a saída, uma assinatura de operação adiciona um novo elemento de Assinatura para o DOM que você tem carregado na memória.Você pode fluxo de saída, transformando-o assim:

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

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

Outras dicas

O XSLT especificação não define o que acontece com o documento de resultado;definido pela API especificações do seu escolhido processador XSLT.Por exemplo, se você chamar XSLT do Java usando o JAXP interface, você pode pedir para o resultado como um DOM de árvore na memória ou para ser serializado para um arquivo especificado no disco.

Que tenha marcado a sua pergunta "Java", que é a única pista que você dar para o seu ambiente de processamento.Meu palpite é que você quer transformar um DOM e, em seguida, usar o DOM de interfaces para obter o valor a partir do novo documento.Mas se você estiver usando XSLT 2.0 e Saxon, o s9api interface é muito mais útil do que o nativo JAXP interface.

O xslt parte define apenas a transformação de definição, nada mais.Ter um olhar para este:

java tutorial xslt

em François Cascalho resposta a input.xml arquivo é o arquivo que será transformada, a transformação.xslt é o xslt definição que descreve como transformar o arquivo xml.saída.são os resultados, isso pode ser xml, mas também pode ser html, arquivo simples...

Este é o lugar onde comecei, quando eu estava usando xslt:

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

Ter um olhar para isso também:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top