这是为什么XML正在输出这个XSLT? 我使用XslCompiledTransform

有人能告诉我,为什么发生这种情况,好吗?

我的XML是:

<?xml version="1.0" encoding="utf-8" ?> <example xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="XMLCompositeQuoteswithSelect.xsd"> <title>some text goes here</title> <atopelem>a top elem</atopelem> <date>today</date> <anode anodeattr="an attribute"> <asubnode>a subnode</asubnode> <somemorecontent>more content</somemorecontent> </anode> <anode anodeattr="another attribute"> <asubnode>another subnode</asubnode> <somemorecontent>even more content</somemorecontent> </anode> </example>

我的XSL是:

<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="XMLCompositeQuoteswithSelect.xsd" exclude-result-prefixes="msxsl xsl xsi xmlns"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/"> <exampleelems> <xsl:copy-of select="*/title | */atopelem | */date" /> <xsl:for-each select="*/anode"> <xsl:element name="node"> <xsl:element name="anodeattr"> <xsl:value-of select="@anodeattr"/> </xsl:element> <xsl:apply-templates /> </xsl:element> </xsl:for-each> </exampleelems> </xsl:template> <xsl:template match="/anode/*" > <xsl:copy > <xsl:apply-templates /> </xsl:copy> </xsl:template> <xsl:template match="node()|@*" > <xsl:copy /> </xsl:template> </xsl:stylesheet>

我的输出XML是:

<?xml version="1.0" encoding="utf-16"?> <exampleelems> <title xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">some text goes here</title> <atopelem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">a top elem</atopelem> <date xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">today</date> <node> <anodeattr>an attribute</anodeattr> <asubnode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /> <somemorecontent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /> </node> <node> <anodeattr>another attribute</anodeattr> <asubnode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /> <somemorecontent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /> </node> </exampleelems>

并且执行这个代码(稍微修剪)是:

// create the xsl transformer XslCompiledTransform t = new XslCompiledTransform(true); t.Load(reader); // create the writer which will output the transformed xml StringBuilder sb = new StringBuilder(); //XmlWriterSettings tt = new XmlWriterSettings(); //tt.Encoding = new UTF8Encoding(false); XmlWriter results = XmlWriter.Create(new StringWriter(sb));//, tt); // write the transformed xml out to a stringbuilder t.Transform(input, null, results);

正如你可能已经猜到了,我真的不希望xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"属性被复制到每个子元素,但我不知道该怎么停下来。

感谢您的任何和所有帮助和信息,

马特。

--------------解决方案-------------

你似乎要变换的根元素的名称,但复制其属性,因此,所有你想要的是如

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

<xsl:output method="xml" indent="yes"/>

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

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

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

<xsl:template match="anode/@anodeattr">
<xsl:element name="{name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>

</xsl:stylesheet>

分类:XML 时间:2015-03-16 人气:3
本文关键词: 命名空间,XML,XSLT
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 3.087 (s). 10 q(s)