копия без пространства имен в xlst1.0 - PullRequest
0 голосов
/ 01 сентября 2010

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

Это входной 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

1 Ответ

0 голосов
/ 01 сентября 2010

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

Второй, от 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>

Редактировать : более компактный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...