添加名称空间前缀到子节点问题

时间:2011-04-19 08:08:27

标签: xml xslt

实际上,因为我看到我可以添加名称空间。因为我非常接近输出,我希望看到。第一个代码:

XML:

<helptext>
    <h6>General configuration options.</h6>
    <h2>Changing not yet supported.</h2>
    <p>this is a <b>paragraph</b><br/>this is a new line</p>
</helptext>

XSL:

<xsl:template name="transformHelptext">
    <xsl:for-each select="./child::*">
        <xsl:element name="ht:{local-name()}">
            <xsl:choose>
                <xsl:when test="count(./child::*)>0">
                    <xsl:call-template name="transformHelptext"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:copy-of select="."/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:element>
    </xsl:for-each>
</xsl:template>

到目前为止一切顺利。 <h6>..</h6><h2>...</h2>行没有问题。 但第三行的子节点是<b>。并且不知何故,“段落”是显示的唯一文本,对于此行。我在choose陈述中有错误。但我无法理解。

由于

P.S:ht名称空间在xsl-stylesheet标签中定义,它是'xmlns:ht =“http://www.w3.org/1999/xhtml”'

P.S:我尝试做的是,可以在我的特定xml节点上应用html标签,样式

2 个答案:

答案 0 :(得分:1)

也许是这样的事情:

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

<xsl:template match="*" >
    <xsl:element name="ht:{local-name(.)}">
        <xsl:apply-templates select="@*|node()"  />
    </xsl:element>
</xsl:template>

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

在“transformHelptext”模板中,选择所有属性和节点并将模板应用于它们。

第二个模板匹配元素节点并更改命名空间。第三个模板匹配属性和文本节点,只创建一个副本。

答案 1 :(得分:1)

输入XML:

<?xml version="1.0" encoding="UTF-8"?>
<helptext>
   <h6>General configuration options.</h6>
   <h2>Changing not yet supported.</h2>
   <p>this is a <b>paragraph</b><br/>this is a new line</p>
</helptext>

<强> XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="*|@*">
    <xsl:element name="ht:{local-name()}" namespace="http://www.w3.org/1999/xhtml">
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

输出XML:

<?xml version="1.0" encoding="UTF-8"?>
<ht:helptext xmlns:ht="http://www.w3.org/1999/xhtml">
    <ht:h6>General configuration options.</ht:h6>
    <ht:h2>Changing not yet supported.</ht:h2>
    <ht:p>
       this is a
       <ht:b>paragraph</ht:b>
       <ht:br />
       this is a new line
    </ht:p>
</ht:helptext>

讨论:   尽可能避免使用<xsl:for-each>,因为它会降低处理器的速度。