2012-07-05 1 views
1

У меня есть один файл xsl и 2 входных xml-файла, из которых должен быть сгенерирован вывод. В одном XML-файле это несколько пространств имен, которые импортируются в файл xsl. Но в другом XML-файле пространство имен не существует. Я должен обрабатывать свой XSL таким образом, что он может обрабатывать оба файла XML, поскольку XSL является общим для обоих входных XML-файлов. Пожалуйста, предложите.Обработка пространства имен

пространство имен в 1-ом файле XML ->

<TreeList xmlns="urn:sfti:documents:BasicTreeList:1:0"  
xmlns:cac="urn:sfti:CommonAggregateComponents:1:0" 
xmlns:cbc="urn:oasis:names:tc:ubl:CommonBasicComponents:1:0" 
xmlns:ccts="urn:oasis:names:tc:ubl:CoreComponentParameters:1:0" 
xmlns:cur="urn:oasis:names:tc:ubl:codelist:CurrencyCode:1:0" 
xmlns:sdt="urn:oasis:names:tc:ubl:SpecializedDatatypes:1:0" 
xmlns:udt="urn:oasis:names:tc:ubl:UnspecializedDatatypes:1:0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

пространство имен в 2-ом файле XML ->

<TreeList xmlns:cac="urn:sfti:CommonAggregateComponents:1:0" 
xmlns:cbc="urn:oasis:names:tc:ubl:CommonBasicComponents:1:0" 
xmlns:ccts="urn:oasis:names:tc:ubl:CoreComponentParameters:1:0" 
xmlns:cur="urn:oasis:names:tc:ubl:codelist:CurrencyCode:1:0" 
xmlns:sdt="urn:oasis:names:tc:ubl:SpecializedDatatypes:1:0" 
xmlns:udt="urn:oasis:names:tc:ubl:UnspecializedDatatypes:1:0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

пространств имен в XSL Файл ->

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:abc="urn:sfti:documents:BasicTreeList:1:0" 
    xmlns:cac="urn:sfti:CommonAggregateComponents:1:0" 
    xmlns:cbc="urn:oasis:names:tc:ubl:CommonBasicComponents:1:0"> 

Когда я запускаю мой XSL файл отлично работает с 1-м XML. Но со вторым файлом XML это плохо работает из-за проблемы пространства имен.

ответ

1

Если вы хотите использовать один и тот же XSLT-код для обработки исходных документов, которые используют те же локальные имена в своем словаре, но в разных пространствах имен, лучшим решением является предварительная обработка одного из файлов для изменения пространств имен. Это можно сделать, используя таблицу стилей, содержащую шаблоны, такие как:

<xsl:template match="*[namespace-uri()='old-uri']"> 
    <xsl:element name="{local-name()}" namespace="new-uri"> 
    <xsl:apply-templates select="@*"/> 
    <xsl:apply-templates select="*"/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="@*[namespace-uri()='old-uri']"> 
    <xsl:attribute name="{local-name()}" namespace="new-uri"> 
    <xsl:value-of select="."/> 
    </xsl:attribute> 
</xsl:template> 

<xsl:template match="*"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*"/> 
    <xsl:apply-templates select="*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="@*"> 
    <xsl:copy/> 
</xsl:template> 
+0

Как и в вопросе, у меня есть несколько пространств имен, поэтому мне нужно создать несколько шаблонов! – Kundan

+0

Возможно, вы недостаточно внимательно прочитали. Мой совет заключается в предварительной обработке ввода, так что он использует стандартизированные пространства имен. Затем на вашем основном этапе обработки вам не придется иметь дело с ненужным разнообразием. –