XSLT 2.0:删除xmlns属性

时间:2014-04-07 11:28:02

标签: xml excel xslt

我遇到一个问题,Microsoft Excel需要内联格式化文本的特定格式,以便Data元素的xmlns为" http://www.w3.org/TR/REC-html40"但子元素(字体和B)没有定义的命名空间:

<Cell>
  <ss:Data xmlns="http://www.w3.org/TR/REC-html40" ss:Type="String" xml:space="preserve">
    <Font>normal text</Font>
    <B>bold text</B>
    <Font Color="#FF0000">red text</Font>
  </ss:Data>
</Cell>

如果将任何xmlns属性添加到Font或B,则它们无法在Microsoft Excel中正确呈现。

我有以下源XML:

<?xml version="1.0" encoding="UTF-8"?>
<document>
    <text>normal text</text>
    <b>bold text</b>
    <red>red text</red>
</document>

我的XSLT文件如下:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:svg="http://www.w3.org/2000/svg" version="2.0" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns="urn:schemas-microsoft-com:office:spreadsheet">

    <xsl:output method="xml" omit-xml-declaration="yes" encoding="utf-8" version="1.0"/>

    <xsl:template match="/">

        <xsl:value-of disable-output-escaping="yes" select="'&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?>'"/>

        <xsl:processing-instruction name="mso-application">progid="Excel.Sheet"</xsl:processing-instruction>

        <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
        xmlns:o="urn:schemas-microsoft-com:office:office"
        xmlns:x="urn:schemas-microsoft-com:office:excel"
        xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
        xmlns:html="http://www.w3.org/TR/REC-html40">

            <Worksheet ss:Name="Worksheet">
                <Table>
                    <Row>
                        <Cell>
                            <ss:Data xmlns="http://www.w3.org/TR/REC-html40" ss:Type="String" xml:space="preserve"><xsl:apply-templates select="node()" /></ss:Data>
                        </Cell>
                    </Row>
                </Table>
            </Worksheet>
        </Workbook>

    </xsl:template>

    <xsl:template match="text">
        <Font><xsl:value-of select="." /></Font>
    </xsl:template>

    <xsl:template match="b">
        <B><xsl:value-of select="." /></B>
    </xsl:template>

    <xsl:template match="red">
        <Font Color="#FF0000"><xsl:value-of select="." /></Font>
    </xsl:template>

</xsl:stylesheet>

想要来实现以下输出(请注意,Font和B)元素没有xmlns属性:

<?xml version="1.0" encoding="utf-8"?><?mso-application progid="Excel.Sheet"?>

<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:svg="http://www.w3.org/2000/svg">
    <Worksheet ss:Name="Worksheet">
        <Table>
            <Row>
                <Cell>
                    <ss:Data xmlns="http://www.w3.org/TR/REC-html40" ss:Type="String" xml:space="preserve"><Font>normal text</Font><B>bold text</B><Font Color="#FF0000">red text</Font>    </ss:Data>
                </Cell>
            </Row>
        </Table>
    </Worksheet>
</Workbook>

相反,我的XSLT转换给了我(注意xmlns已被添加到Font和B元素中):

<?xml version="1.0" encoding="utf-8"?><?mso-application progid="Excel.Sheet"?>

<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:kc="http://www.kelvinconnect.com/"
xmlns:svg="http://www.w3.org/2000/svg">
    <Worksheet ss:Name="Worksheet">
        <Table>
            <Row>
                <Cell>
                    <ss:Data xmlns="http://www.w3.org/TR/REC-html40" ss:Type="String" xml:space="preserve"><Font xmlns="urn:schemas-microsoft-com:office:spreadsheet">normal text</Font><B xmlns="urn:schemas-microsoft-com:office:spreadsheet">bold text</B><Font Color="#FF0000" xmlns="urn:schemas-microsoft-com:office:spreadsheet">red text</Font></ss:Data>
                </Cell>
            </Row>
        </Table>
    </Worksheet>
</Workbook>

我理解定义的默认命名空间(urn:schemas-microsoft-com:office:spreadsheet)正被添加到Font和B元素中以阐明命名空间,因为父项(ss:Data)被定义为在&#34; http://www.w3.org/TR/REC-html40&#34;命名空间,但我的问题是,除非将ss:Data元素定义为使用&#34; http://www.w3.org/TR/REC-html40&#34;的xmlns,否则Microsoft Excel根本不起作用。并且B和Font元素不指定xmlns属性。

有人可以建议一种方法来改变我的XSLT转换,使xmlns元素不会添加到B和Font元素中吗?

我尝试添加exclude-result-prefixes =&#34; #default&#34;,但这没有效果。

我还尝试将模板更改为:

<xsl:template match="b">
  <xsl:element name="B" namespace="">
    <xsl:value-of select="." />
  </xsl:element>
</xsl:template>

但这只是将xmlns属性更改为空白(xmlns =&#34;&#34;)而不是完全删除属性。

1 个答案:

答案 0 :(得分:2)

将命名空间设置为&#34;&#34;不起作用,因为这意味着 B 元素不再属于任何名称空间,当你真的希望它属于http://www.w3.org/TR/REC-html40名称空间时。

尝试这样做。

<xsl:template match="b">
  <xsl:element name="B" namespace="http://www.w3.org/TR/REC-html40">
    <xsl:value-of select="." />
  </xsl:element>
</xsl:template>

这样做,意味着&#34; red&#34;你必须添加像这样的属性

<xsl:template match="red">
  <xsl:element name="font" namespace="http://www.w3.org/TR/REC-html40">
    <xsl:attribute name="Color">#FF0000</xsl:attribute>
    <xsl:value-of select="." />
  </xsl:element>
</xsl:template>