2016-09-30 5 views
0

Apologies.I видел много похожих вопросов, но, к сожалению, большинство из них не работало для меня. Мое требование: 1) Я должен добавить пространство имен только для корневого элемента, используя XSLT 2) Я использую xsl: result-document для создания нескольких XML-файлов с одного входа. Элементы Root для всего результирующего документа должны иметь пространство имен.Добавление пространства имен только к корневому элементу с помощью xslt

Если я попробую следующее решение, я получаю XMLNS во всех моих дочерних корневых тегах. Если я попробую xsl: copy, я получаю тег от ввода XML, который мне не нужен, потому что мои выходные теги полностью отличаются от моего ввода.

I/р:

<einfo> 
    <employee> 
     <eid>456</eid> 
     <firstname>def</firstname> 
     <lastname>y</lastname> 
    </employee> 
</einfo> 

мой XSLT:

<xsl:stylesheet version="2.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*"/> 
    <!-- Global Variables --> 
    <xsl:variable name="lcletters">abcdefghijklmnopqrstuvwxyz</xsl:variable> 
    <xsl:variable name="ucletters">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable> 
    <xsl:template match="einfo"> 
     <xsl:for-each select="employee"> 
      <xsl:variable name="docName" select="eid"/> 
      <xsl:result-document href="{$docName}"> 
      <xsl:element name="employee" namespace="myurl"> 
      <xsl:call-template 
        name="processEmployees"> 
       <xsl:with-param name="p_firstname" 
           select="firstname"/> 
       <xsl:with-param name="p_lastname" 
           select="lastname"/> 
      </xsl:call-template> 
      </xsl:element> 
      </xsl:result-document> 
     </xsl:for-each> 
    </xsl:template> 
    <xsl:template name="processEmployees"> 
     <xsl:param name="p_firstname"/> 
     <xsl:param name="p_lastname"/> 
     <xsl:element name="firstname"> 
      <xsl:value-of select="$p_firstname"/> 
     </xsl:element> 
     <xsl:element name="lastname"> 
      <xsl:value-of select="$p_lastname"/> 
     </xsl:element> 
    </xsl:template> 
    </xsl:stylesheet> 

Фактический выход:

<?xml version="1.0" encoding="UTF-8"?> 
<employee xmlns="myurl"> 
    <firstname xmlns="">def</firstname> 
    <lastname xmlns="">y</lastname> 
</employee> 

Ожидаемый результат: Мне нужен только корневой элемент, т.е. служащему иметь пространство имен (XMLNS).

+0

Пожалуйста, пост ** ** воспроизводимого примера, в том числе входа и ** ** полного (желательно) свернутая таблицы стилей - см: [mcve]. - В общем, вы неправильно понимаете, как работают пространства имен.По умолчанию пространство имен наследуется. Если вы не хотите, чтобы 'address' имел переопределяющее объявление пространства имен без имени, которое оно имеет сейчас, вы должны поместить его в то же пространство имен, что и родительский' home'. Аналогично для всех остальных элементов в дереве результатов. –

ответ

0
I just need name space for tag and not for all the other child tag. 

Вы путаетесь между узлами пространства имен и объявлениями пространства имен. Xmlns = "" добавляется к дочернему элементу, потому что в вашем дереве результатов дочерний элемент находится в другом пространстве имен от родителя. Если вы не хотите xmlns = "", это говорит о том, что вы действительно хотите, чтобы ребенок находился в том же пространстве имен, что и родитель. Вы не показали нам шаблон processAdd, но доказательством является то, что он создает адрес без пространства имен, когда он должен создавать адрес в пространстве имен myurl.

+0

@ micheal.hor257k, Michael Kay, Извините за недоумение. Я разместил i/p, xslt и вывод, чтобы объяснить сценарий. Надеюсь, это поможет. –

0

Почему вы не просто сделать:

XSLT 2,0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> 

<xsl:template match="/einfo"> 
    <xsl:for-each select="employee"> 
     <xsl:result-document href="{eid}"> 
      <employee xmlns="myurl"> 
       <firstname> 
        <xsl:value-of select="firstname" /> 
       </firstname> 
       <lastname> 
        <xsl:value-of select="lastname" /> 
       </lastname> 
      </employee> 
     </xsl:result-document> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

Примечание:

На первый взгляд, может показаться, что:

<firstname> 
    <xsl:value-of select="firstname" /> 
</firstname> 

может быть сокращен до:

<xsl:copy-of select="firstname" /> 

Однако, это не так. Литеральный элемент результата <firstname> в таблице стилей наследует пространство имен его родителя <employee xmlns="myurl">. Запись:

<employee xmlns="myurl"> 
    <firstname> 
     <xsl:value-of select="firstname" /> 
    </firstname> 

точно так же, как написание:

<employee xmlns="myurl"> 
    <firstname xmlns="myurl"> 
     <xsl:value-of select="firstname" /> 
    </firstname> 

Ото, если скопировать исходный firstname элемент из исходного XML, он будет скопирован в оригинал namesepace (нет-имен в этот случай), и появится на выходе, как:

<firstname xmlns=""> 
Смежные вопросы