سؤال

لدي مستند XML. أقوم بتوقيع جزء من المستند باستخدام توقيع xml.قبل العثور على الملخص، أريد تطبيق تحويل XSLT.

وفقًا لما قرأته، يقوم XSLT بتحويل ملف مستند XML إلى تنسيق آخر (يمكن أن يكون XML أيضًا). الآن أنا في حيرة من أمري،
أين ستكون الوثيقة الجديدة المحولة متاحة؟

كيفية استرداد القيمة من هذا المستند الذي تم إنشاؤه حديثًا إذا كنت أرغب في إظهارها للمستخدم؟

مستند XML الخاص بي

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

رمز للتحول

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

وفقًا لتحويل xpath، عندما تتغير قيمة عنصر المستخدم، لا ينبغي التحقق من صحة توقيع xml.وإذا تغيرت قيمة عنصر الشخص، فيجب التحقق من صحة التوقيع.ولكن عندما أقوم بتغيير قيمة عنصر الشخص، لا يتم التحقق من صحة التوقيع.لماذا؟

هل كانت مفيدة؟

المحلول

يرتبط تحويل xslt المستخدم عند توقيع مستند بكيفية تحديد العقد في XML المصدر عند حساب التوقيع.

هذا السؤال/الجواب بواسطة ديف يتعلق بتوقيع أجزاء من مستند XML باستخدام xpath2.ال رابط إلى مشاركة شون مولانز في هذه الإجابة تشير إلى أن xpath2 أكثر ملاءمة لتوقيع أجزاء من المستند لأن تقييم تعبير xpath يتم لكل عقدة.

لذلك بناء على مثال الشمس 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); 

هذا يسمح //r1/user لتكون محمية بالتوقيع بينما يمكن تعديل بقية المستند.

المشكلة في تحديد 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 تعريف التحويل فقط، ولا شيء آخر.الق نظرة على هذا:

تعليم جافا xslt

في الإجابة فرانسوا جرافيل ملف input.xml هو الملف الذي سيتم تحويله، وtransform.xslt هو تعريف xslt الذي يصف كيفية تحويل ملف XML.Output.out هي النتائج، قد يكون هذا بتنسيق XML، ولكن يمكن أيضًا أن يكون html أو ملفًا مسطحًا...

هذا هو المكان الذي بدأت به عندما كنت أستخدم xslt:

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

أنظر إلى هذا أيضاً:

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top