Аз трябва да генерират schematron файлове за различниxml файлови схеми, използвайки наличната информация под елементите appinfo (правя трансформация xsl, за да генерирам схеми на schemantron, които се компилират отново по-късно).
Правилата за xpath, които се изискват за схеми за схеми, са написани под този appinfo елемент. Тези правила обаче не съдържат префикс на пространство за имена. По този начин не мога да използвам схемата "НЧ" маркер за добавяне на пространство за имена към компилирания окончателен xslt файл.
Решението би било добавяне на XPath-подразбиране-пространство от имена атрибут на окончателно съставен xslt. За съжаление не можах да намеря маркер за добавяне на атрибут xpath-default-namespace.
Има ли някакво решение за този случай? Благодаря.
Отговори:
1 за отговор № 1Очевидно няма налична опция за задаване на a xpath-default-namespace
, В допълнение към трансформирането на генерирания XSLT, друга опция би била да модифицира / разшири схемата XSLT, за да генерира желания изход, така че да можете да го генерирате в един пропуск.
- Създайте стилова таблица, която импортира
iso_schematron_skeleton_for_saxon.xsl
Замяна на шаблона, който генерира element to insert the
xpath-default-namespace` атрибут:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:axsl="http://www.w3.org/1999/XSL/TransformAlias"
xmlns:iso="http://purl.oclc.org/dsdl/schematron"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl"
version="2.0"
>
<xsl:import href="iso_schematron_skeleton_for_saxon.xsl"/>
<!-- Using XSLT 2 -->
<xsl:template
match="iso:schema[@queryBinding="xslt2" or @queryBinding ="xpath2"]"
priority="10">
<axsl:stylesheet
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:saxon="http://saxon.sf.net/">
<!-- insert the default namespace attribute -->
<xsl:attribute name="xpath-default-namespace" select=""http://your/default/namespace/goes/here""/>
<xsl:apply-templates
select="iso:ns" />
<!-- Handle the namespaces before the version attribute: reported to help SAXON -->
<xsl:attribute name="version">2.0</xsl:attribute>
<xsl:apply-templates select="." mode="stylesheetbody"/>
<!-- was xsl:call-template name="stylesheetbody"/ -->
</axsl:stylesheet>
</xsl:template>
</xsl:stylesheet>
- Променете
iso_svrl_for_xslt2.xsl
да импортирате вашите приоритетни стилове:
Променете пътя за импортиране на вашето превъзхождащо XSLT:
<!-- Select the import statement and adjust the path as
necessary for your system.
-->
<xsl:import href="iso_schematron_skeleton_for_saxon_with_default_namespace.xsl"/>
1 за отговор № 2
Тъй като XSLT е XML файл, можете да трансформирате компилирания / трансформирания XSLT schematron и да го вмъкнете @xpath-default-namespace
себе си:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<xsl:attribute name="xpath-default-namespace" select=""http://your/default/namespace""/>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>