在xlst1.0中没有名称空间的副本

时间:2010-09-01 08:37:26

标签: xml xslt

我想对xml进行XSLT 1.0转换,我使用该节点。现在,当我应用它时,它会在复制的项目上设置一个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 :(得分: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>

修改:更紧凑的代码。