我想对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
答案 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>
修改:更紧凑的代码。