2014-01-28 2 views
1

Сначала я получу квалификацию, что я не очень хорошо разбираюсь в XSLT. Но я пытаюсь скопировать 3 XML-документа в один родительский документ.XSLT для копирования элемента без пространства имен

XSLT работает отлично, за исключением того, что родительские узлы печатаются с атрибутом xmlns = "", что приводит к сбою моих проверок.

Итак, мой вопрос заключается в том, как скопировать эти элементы из отдельных документов без добавления этого атрибута xmlns?

Это образец вывода в пункт назначения - примечание Я хочу, чтобы он не печатал xmlns = "".

<Feed xmlns="http://www.bazaarvoice.com/xs/PRR/ProductFeed/5.6" 
name="Officeworks" incremental="false" 
extractDate="2014-01-28T14:42:12+11:00"> 
    <Brands xmlns=""> 
    <Brand> 
     <Name>Panasonic</Name> 
     <ExternalId>12345</ExternalId> 
    </Brand> 

Это XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ex="http://exslt.org/dates-and-times" extension-element-prefixes="ex"> 

<xsl:template match="/"> 
    <xsl:variable name="dateNow" select="ex:date-time()"/> 
    <Feed xmlns="http://www.bazaarvoice.com/xs/PRR/ProductFeed/5.6" name='Officeworks' incremental='false'> 
    <xsl:attribute name="extractDate"><xsl:value-of select="$dateNow" /></xsl:attribute> 
    <xsl:copy-of select="document('@[email protected]/bv_brands_xml.001.xml')/Brands"/> 
    <xsl:copy-of select="document('@[email protected]/bv_categories_xml.001.xml')/Categories"/> 
    <xsl:copy-of select="document('@[email protected]/bv_products_xml.001.xml')/Products"/> 
    </Feed> 
</xsl:template> 

</xsl:stylesheet> 
+0

Ваша информация очень запутанным. Вы явно создаете элемент Feed в пространстве имен «http://www.bazaarvoice.com/xs/PRR/ProductFeed/5.6», и в ответ на кешлам вы говорите, что узлы должны находиться в этом пространстве имен, но тогда вы говорите вы не хотите, чтобы он «печатал атрибут xmlns = ...», который является тем, что помещает его в это пространство имен. Вы хотите это в пространстве имен или нет? –

ответ

0

xmlns="" требуется потому, что вы утверждать пространство имен по умолчанию (с xmlns="http://www.bazaarvoice.com/xs/PRR/ProductFeed/5.6"), а затем выводит узлы, которые не находятся в этом пространстве имен. Чтобы XML правильно отображал это, он должен отменить пространство имен по умолчанию.

Вы не сказали нам, как валидация терпит неудачу. Если это происходит из-за того, что эти узлы должны находиться в указанном пространстве имен, они должны либо находиться в этом пространстве имен, прежде чем копировать их, либо вам необходимо заменить операцию xsl:copy-of на то, что она явно реконструирует их, извлекая их локальное имя и используя это и желаемое пространства имен в качестве параметров операции xsl:element. Предметы, перечисленные ниже под Связанные расскажут вам об этом подробнее.

+0

Узлы должны находиться в этом пространстве имен. У меня есть доступ к исходной программе, поэтому я могу ее изменить, чтобы поместить их в это пространство имен. Я попробую. –

+0

Это, безусловно, было бы самым простым решением. Пространства имен являются частью имени узла. Оставляя их при создании документа, это как отказ от письма от имени - это изменяет значение документа. Вы можете исправить это, но лучше «правильно произнести» его, если сможете это сделать. – keshlam

+0

В итоге я отказался от попыток поместить исходные узлы в пространство имен. Узлы печатали с правильным пространством имен в исходных файлах, но затем, когда xslt запускал его, он не копировал их в файл. Я уверен, что я просто не понимаю xslt правильно. Поэтому я вернулся к подходу с локальной копией и просто явно установил их в правильное пространство имен, похоже, решил проблему, поэтому он будет делать это для решения. Спасибо за помощь. –

1

Вы можете использовать:

<xsl:copy-of select="bla" copy-namespaces="no"></xsl:copy-of> 

жаль ... просто заметил, что вы используете XSLT 1, поэтому копировать-пространство имен не поддерживается ... мой плохой

+1

не по какому-либо определенному выбору, по-видимому, это то, что по умолчанию поддерживает ANT (что я и использую для преобразования xslt между прочим). Я затронул несколько вопросов, где это было бы легко разрешено с помощью XSLT 2. –

Смежные вопросы