كيفية إضافة @xml: قاعدة إلى ملفات .xml الخاصة بي؟
سؤال
أحتاج إلى ورقة أنماط لتحويل ملفات Docbook XML الخاصة بي بحيث تتضمن الآن XML: العنصر الأساسي إلى علامات القسم الخاصة بي. كيف يمكنني القيام بذلك (منذ XML: يحتاج الأساس إلى نظام ومعلومات العقدة ؟؟؟)
إدخال:
<section xmlns="http://docbook.org/ns/docbook" xml:id="voidVisit" version="5">
<title>Void</title>
<section>
<title>Screenshot</title>
<mediaobject>
<imageobject>
<imagedata fileref="screenshots/Dialog.png" />
</imageobject>
</mediaobject>
</section>
</section>
انتاج:
...
<section xml:id="void" version="5"
xml:base="file:/C:/Projects/my/proj/trunk/spec/module/components/void.xml">
<title>Void</title>
<section>
<title>Screenshot</title>
<mediaobject>
<imageobject>
<imagedata fileref="screenshots/Dialog.png"/>
</imageobject>
</mediaobject>
</section>
...
المحلول
في XSLT 2.0 (XPath 2.0) الوظائف static-base-uri()
و base-uri()
يمكن استخدامه لهذا الغرض.
هنا مثال عمل:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="/">
<doc xml:base="{base-uri()}"/>
</xsl:template>
</xsl:stylesheet>
عند تطبيق هذا التحول ، يتم إنتاج النتيجة المطلوبة:
<doc xml:base="file:/C:/CVS-DDN/fxsl-xslt2/data/marrowtr.xml"/>
لذلك ، التحول الكامل في قضيتك:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:d="http://docbook.org/ns/docbook">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/d:section">
<xsl:copy>
<xsl:attribute name="xml:base" select="base-uri(/)"/>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
في XSLT 1.0 الحل هو لتمرير القاعدة uri كمعلمة خارجية (عالمية xsl:param>
) إلى التحول.
لا تنتمي إلى StackOverflow