XSLT преобразование в XMLSignature Java?
-
11-12-2019 - |
Вопрос
У меня есть документ XML. Я подписываю часть документа, используя XMLSignature.Перед поиском Diagest, я хочу применить преобразование XSLT.
Согласно тому, что я читаю, XSLT преобразует
Где будет трансформированный новый документ, доступный?
Как получить значение из этого вновь созданного документа, если я хочуЧтобы показать это пользователю?
мой XML документ
.
<r1>
<user>asd</user>
<person>ghi</person>
</r1>
<Сильный> код для преобразования
.
Transform t=fac.newTransform(Transform.XPATH,new XPathFilterParameterSpec("/r1/user"));
в соответствии с преобразованием XPath, когда значение элемента пользователя изменяет XMLSignature, не следует проверять.И если изменение значения элемента человека, то подпись должна быть подтверждена.Но когда я изменил значение элемента человека, подпись не подтверждена.Почему?
Решение
Преобразование XSLT, используемое при подписании документа, относится к тому, как узлы в вашем источнике XML выбираются при рассчитывании подписи.
Этот вопрос / ответ от Ссылка Для поста Sean 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);
Это позволяет
Проблема с выбором XPath / XPath2 состоит в том, что подпись может быть сгенерирована для
Вы можете проверить документ в тестовой программе, создавая подпись, затем вмешивающуюся с узлом 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 определяет только определение преобразования, ничего больше. Посмотрите на это:
В FRANCOIS GRAVEL INVAINE PALE input.xml - это файл, который будет преобразован, преобразование.xSLT - это определение XSLT, которое описывает, как преобразовать файл XML.Выходные данные. - это результаты, это может быть XML, но он также может быть HTML, плоский файл ...
Это где я начал с тем, когда я использовал XSLT:
http://www.w3schools.com/xsl/default.asp
Посмотрите на это также:
http://www.w3schools.com/xsl/truxslt.asp? xmlfile= cdcatalog & xsltfile= cdcatalog