Transformação XSLT em xmlSignature java?
-
11-12-2019 - |
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ê?
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:
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