Преобразование XSLT в xmlsignature java?
у меня есть XML-документ.Я подписываю часть документа с помощью xmlsignature. Прежде чем найти дайджест, Я хочу применить преобразование XSLT.
согласно тому, что я читал, XSLT преобразует XML-документ в другой формат (также может быть XML). теперь я смущен, что,
где будет преобразованный новый документ доступен?
как получить значение из этого вновь созданного документа, если я хочу показать его пользователь?
мой XML-документ
<r1>
<user>asd</user>
<person>ghi</person>
</r1>
код для преобразования
Transform t=fac.newTransform(Transform.XPATH,new XPathFilterParameterSpec("/r1/user"));
согласно преобразованию xpath, всякий раз, когда значение пользовательского элемента изменяется, xmlsignature не должен быть проверен. И если значение элемента person изменяется, то подпись должна быть проверена. Но когда я изменяю значение элемента person, подпись не проверяется. Почему?
3 ответов
преобразование xslt, используемое при подписании документа, относится к выбору узлов в исходном XML при вычислении подписи.
вопрос/ответ by Дэйв относится к подписыванию частей XML-документа с помощью xpath2. The ссылка на Шон Mullans' в должности в этом ответе предполагается, что xpath2 более подходит для подписания частей документа, поскольку оценка выражения xpath выполняется для каждого узла.
так на основе sun dsig пример можно заменить на ссылка создание с помощью:
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);
в данном //Р1/пользователей быть защищенным подписью, в то время как остальная часть документа может быть изменена.
проблема с выбором xpath / xpath2 заключается в том, что подпись может быть сгенерирована для / some / node/that/does/not / exist. Вы правы, чтобы изменить тестовый документ и убедиться, что подпись работает так вы ожидаете.
вы можете проверить документ в тестовой программе, создав подпись, а затем подделав узел xml перед проверкой:
NodeList nlt = doc.getElementsByTagName("user");
nlt.item(0).getFirstChild().setTextContent("Something else");
Более надежной альтернативой селектору xpath может быть размещение идентификатора на элементах xml-документа, которые вы надеетесь подписать как:
<r1>
<user id="sign1">asd</user>
<person>ghi</person>
</r1>
затем ссылайтесь на этот идентификатор как на URI в первом параметре обернутой передачи:
Reference ref = fac.newReference
("#sign1", fac.newDigestMethod(DigestMethod.SHA1, null),
Collections.singletonList
(fac.newTransform(Transform.ENVELOPED,(TransformParameterSpec) null)),
null, null);
На выходных операция подписи добавляет новый элемент подписи в DOM, загруженный в память. Вы можете транслировать вывод, преобразуя его следующим образом:
TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
trans.setOutputProperty(OutputKeys.INDENT, "yes");
trans.transform(new DOMSource(doc), new StreamResult(System.out));
спецификация XSLT не определяет, что происходит с результирующим документом; это определяется спецификациями API выбранного процессора XSLT. Например, если вы вызываете XSLT из Java с помощью интерфейса JAXP, вы можете запросить результат в виде дерева DOM в памяти или сериализовать его в указанный файл на диске.
вы пометили свой вопрос "Java", который является единственным ключом, который вы даете своей среде обработки. Я предполагаю, что вы хотите превратиться в DOM и затем используйте интерфейсы DOM, чтобы получить значение из нового документа. Хотя, если вы используете XSLT 2.0 и Saxon, интерфейс s9api намного более удобен, чем собственный интерфейс JAXP.
часть xslt определяет только определение преобразования, ничего больше. Взгляните на это:
во Франсуа гравий ответить на вход.XML-файл-это файл, который будет преобразован, преобразование.xslt-это определение xslt, которое описывает, как преобразовать xml-файл. выход.из результатов, это может быть xml, но это также может быть html, плоский файл...
Это то, с чего я начал, когда я использовал xslt:
http://www.w3schools.com/xsl/default.asp
взгляните на это:
http://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog