2012-05-16 9 views
1

У меня есть XML я хочу, чтобы скопировать как как (проверьте Xmlns = «» и тег. Я хочу, чтобы создать как есть.XSLT пустого пространство имен

Общий расчет берется по уходу. Только этот вопрос. Действительно все равно клиент хочет, чтобы ожидаемый формат был таким. Любая помощь была значительно оценена. три задачи

1) Мне нужно добавить пространство имен Сотрудники xmnls = "1.2" xmlns: xsi = "3" xsi: schemalocation = "4 "> 2) генерация тега, подобного этому, на выходе xml не 3) необходимо избегать xmlns =" ​​"

любая помощь заранее gr eatly оценил rameshkumar Singh

Input.xml

<Employees> 
      <employee> 
      <dept>1</dept> 
       <sec></sec> 
      </employee> 
      <employee> 
       <dept>2</dept> 
       <sec></sec> 
      </employee> 
    </Employees> 

Expected.XML 

     <Employees xmnls="1.2" xmlns:xsi="3" xsi:schemalocation="4"> 
      <totalemp>2</totalemp> 
      <employee> 
       <dept>1</dept> 
       <sec></sec> 
      <employee> 
       <employee> 
        <dept>2</dept> 
        <sec></sec> 
       <employee> 
       </Employees> 


actual.XML 
       <Employees> 
        <totalemp>2</totalemp> 
         <employee xmlns=""> 
         <dept>1</dept> 
          <sec/> 
         </employee> 
         <employee> 
          <dept>2</dept> 
           <sec/> 
          <employee> 
       </Employees> 
+0

Можете ли вы создать правильный XML непосредственно вместо того, чтобы пытаться использовать XSLT для преобразования? (BTW, ваш ключ «сдвиг», кажется, сломан, поскольку предложения имеют случайную капитализацию) –

ответ

2

Вот как это сделать:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xsi="3"> 

    <xsl:output indent="yes"/> 

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

    <xsl:template match="*" priority="2"> 
     <xsl:element name="{local-name()}" namespace="1.2"> 
      <xsl:if test="self::Employees"> 
       <xsl:attribute name="xsi:schemalocation">4</xsl:attribute>   
      </xsl:if> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

Вы применить тождественное преобразование по умолчанию, а затем заменить его на элементы, чтобы дать их новое пространство имен, а также специальный атрибут для узла Employees. Я решил добавить оператор if, но вы также можете переместить эту логику в другой шаблон, который соответствует Employees. Я просто не хотел повторять всю вещь xsl:element дважды. Вопрос вкуса действительно.

Когда я применить это преобразование к вашей входной документ я в конечном итоге с:

<Employees xmlns="1.2" xmlns:xsi="3" xsi:schemalocation="4"> 
    <employee> 
     <dept>1</dept> 
     <sec/> 
    </employee> 
    <employee> 
     <dept>2</dept> 
     <sec/> 
    </employee> 
</Employees> 

Вы имели xmlns="" в ваш результат, вероятно, потому что вы не воссоздавать все элементы в этом новом пространстве имен. Кроме того, чтобы добавить атрибут xsi:schemalocation, вам нужно объявить пространство имен xsi в документе преобразования.

0

Это короткое и простое преобразование (имеет минимальное количество шаблонов и не использует какие-либо явные XSLT условных инструкций, не xsl:attribute или priority атрибутов):

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xsi="3" xsi:schemalocation="4"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="node()[not(self::*)]|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*"> 
    <xsl:element name="{name()}" namespace="1.2"> 
    <xsl:copy-of select= 
    "document('')/*[not(current()/../..)] 
         /@xsi:schemalocation"/> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

при нанесении на предоставленном документе XML :

<Employees> 
    <employee> 
     <dept>1</dept> 
     <sec></sec> 
    </employee> 
    <employee> 
     <dept>2</dept> 
     <sec></sec> 
    </employee> 
</Employees> 

производит разыскиваемого, правильный результат:

<Employees xmlns="1.2" xmlns:xsi="3" xsi:schemalocation="4"> 
    <employee> 
     <dept>1</dept> 
     <sec/> 
    </employee> 
    <employee> 
     <dept>2</dept> 
     <sec/> 
    </employee> 
</Employees> 
+0

i ожидал результата как не как

+0

@RameshSingh: Эти два эквивалента. Оба представляют элемент 'sec' без детей. Точное лексическое представление не может контролироваться изнутри преобразования и часто отличается от одного XSLT-процессора другим. Если это действительно так важно, вы можете обмануть XSLT-процессор: '' –

+0

Я не могу его обмануть, в моем реальном требовании у меня есть около 1000 xml-тэгов. Мой клиент хочет использовать тег . Я попробовал Method = html, используя копию я получаю xmlns = "" проблема. Я не знаю, как обращаться с обоими –

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