开发者

Why is this XML being output by this XSLT? I'm using the XslCompiledTransform

Could someone tell me why this is happening, please?

My XML is:

<?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>m开发者_Go百科ore content</somemorecontent>
    </anode>
    <anode anodeattr="another attribute">
        <asubnode>another subnode</asubnode>
        <somemorecontent>even more content</somemorecontent>
    </anode>
</example>

My XSL is:

<?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>

My output XML is:

<?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>

And the code which executes this (slightly trimmed) is:

    // 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);

As you can probably guess, I really don't want the xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" attributes being copied to every child element, but I don't know how to stop it.

Thanks for any and all help and info,

Matt.


You seem to want to transform the name of the root element but copy its attribute so all you want is e.g.

<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>
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜