2010-09-01 3 views
0

Я хочу преобразовать XSLT 1.0 в xml, где я использую этот узел. Теперь, когда я применяю это, он устанавливает пространство имен xmlns на скопированных элементах, можно ли это избежать?копирование без пространства имен в xlst1.0

Это входной XML:

<ns0:Task xmlns:ns0="http://Sharepoint.Task"> 
    <UserName>FalcoLannoo</UserName> 
    <Title>Task1</Title> 
    <Description>Description_0</Description> 
    <Library>Library_0</Library> 
    <DueDate>1999-05-31</DueDate> 
    <Priority>10</Priority> 
</ns0:Task> 

И я использую эту XSL, чтобы преобразовать его:

<?xml version="1.0" encoding="UTF-16"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"   
xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var" exclude-result-prefixes="msxsl var s0 ns0" version="1.0" xmlns:tns="http://schemas.microsoft.com/sharepoint/soap/" xmlns:ns1="http://microsoft.com/wsdl/types/" xmlns:s0="http://Sharepoint.Batch" xmlns:ns0="http://Sharepoint.Batch"> 
    <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" /> 
    <xsl:template match="/"> 
    <xsl:apply-templates select="/s0:updates" /> 
    </xsl:template> 
    <xsl:template match="/s0:updates"> 
    <tns:UpdateListItems> 
    <tns:listName> 
     <xsl:value-of select="listName/text()" /> 
    </tns:listName> 
    <tns:updates> 
     <xsl:copy-of select="/s0:updates/Batch" /> 
    </tns:updates> 
    </tns:UpdateListItems> 
</xsl:template> 
</xsl:stylesheet> 

И выходной файл следующим образом:

<tns:UpdateListItems xmlns:tns="http://schemas.microsoft.com/sharepoint/soap/"  
xmlns:ns1="http://microsoft.com/wsdl/types/"> 
<tns:listName>{58887260-E5EB-4AB5-B105-E5DD57C8C8E0}</tns:listName> 
<tns:updates> 
    <Batch OnError="Continue" ListVersion="1" ViewName="" 
    xmlns:ns0="http://Sharepoint.Batch"> 
     <Method ID="1" Cmd="New"> 
      <Field Name="UserName">FalcoLannoo</Field> 
      <Field Name="Title">Task1</Field> 
      <Field Name="Description">Description_0</Field> 
      <Field Name="Library">Library_0</Field> 
      <Field Name="DueDate">1999-05-31</Field> 
      <Field Name="Priority">10</Field> 
     </Method> 
    </Batch> 
</tns:updates> 
</tns:UpdateListItems> 

И это строка, из которой я хочу избавиться: xmlns: ns0 = "http: //Sharepoint.Batch" (в пакетном узле)

thx

+0

Можете ли вы разместить свой XSLT-код и XML, который вы трансформируете? – Mark

+0

ok, отредактировал его с образцами кода. –

+0

Я не вижу, как входной XML соответствует таблице стилей или выводам? Входной XML-запрос относится к элементам, называемым ns0: Task, а таблица стилей и выходных данных относятся к пакетным и обновлениям в другом пространстве имен? – Robin

ответ

0

Во-первых, ваш образец ввода не соответствует вашему выходу.

Во-вторых, из http://www.w3.org/TR/xslt#copy-of

Когда результатом является множество узлов, все узлы в наборе копируются в порядке документа в конечное дерево; копирование узла элемента копирует узлы атрибута , узлы пространства имен и дочерние элементы узла элемента, а также в качестве самого элемента элемента.

Так что это по дизайну. И это совершенно логично, потому что в пространстве имен пространства являются частью структуры.

Для того, чтобы отогнать в области видимости пространства имен, вы должны использовать этот вид таблицы стилей:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:tns="http://schemas.microsoft.com/sharepoint/soap/" 
xmlns:s0="http://Sharepoint.Batch" 
exclude-result-prefixes="s0"> 
    <xsl:output omit-xml-declaration="yes"/> 
    <xsl:template match="s0:updates"> 
     <tns:UpdateListItems> 
      <tns:listName> 
       <xsl:value-of select="listName" /> 
      </tns:listName> 
      <tns:updates> 
       <xsl:apply-templates select="Batch" /> 
      </tns:updates> 
     </tns:UpdateListItems> 
    </xsl:template> 
    <xsl:template match="*"> 
     <xsl:element name="{name()}"> 
      <xsl:copy-of select="@*" /> 
      <xsl:apply-templates select="node()" /> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

С этим входом:

<ns0:updates xmlns:ns0="http://Sharepoint.Batch"> 
    <listName>list</listName> 
    <Batch OnError="Continue" ListVersion="1" ViewName=""> 
     <Method ID="1" Cmd="New"> 
      <Field Name="UserName">FalcoLannoo</Field> 
      <Field Name="Title">Task1</Field> 
      <Field Name="Description">Description_0</Field> 
      <Field Name="Library">Library_0</Field> 
      <Field Name="DueDate">1999-05-31</Field> 
      <Field Name="Priority">10</Field> 
     </Method> 
    </Batch> 
</ns0:updates> 

Выход:

<tns:UpdateListItems 
xmlns:tns="http://schemas.microsoft.com/sharepoint/soap/"> 
    <tns:listName>list</tns:listName> 
    <tns:updates> 
     <Batch OnError="Continue" ListVersion="1" ViewName=""> 
      <Method ID="1" Cmd="New"> 
       <Field Name="UserName">FalcoLannoo</Field> 
       <Field Name="Title">Task1</Field> 
       <Field Name="Description">Description_0</Field> 
       <Field Name="Library">Library_0</Field> 
       <Field Name="DueDate">1999-05-31</Field> 
       <Field Name="Priority">10</Field> 
      </Method> 
     </Batch> 
    </tns:updates> 
</tns:UpdateListItems> 

Edit: Более компактный код.

+0

** Примечание к себе: ** Это будет работать с XML 1.0. - С XML 1.1 привязка префикса пространства имен должна быть сброшена как ' 2010-09-10 21:40:49

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