使用XSLT转换的XML中的特殊字符

时间:2013-11-30 20:03:05

标签: xml xslt character

有人可以提供帮助吗?我正在重命名节点,但是没有格式化。我的XML是:

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

我正在使用下面的XSLT进行转换。输出总是:

<?xml version="1.0" encoding="UTF-8"?>
<root>    
<description pstyle="description"></description>
</root>

但正确的XML输出必须是:

<?xml version="1.0" encoding="UTF-8"?>
<root>    
<description aid:pstyle="description"></description>
</root>

有没有办法在XSLT转换中不会发生这种情况?

我的XSLT是:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="no"/>
<xsl:template match="@* | node()">
            <xsl:copy>
                <xsl:apply-templates select="@* | node()"/>
            </xsl:copy>
    </xsl:template>
    <xsl:template match="demo">
<description aid:pstyle="description"><xsl:apply-templates select="@*|node()"/>
</description>
</xsl:template>
</xsl:stylesheet>

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

假设您确实需要格式良好的XML输出......

您的输入XML:

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

修改XSLT以定义aid名称空间前缀:

<?xml version="1.0" encoding="ISO-8859-1"?>
<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="demo">
    <description xmlns:aid="http://example.com/aid"
                 aid:pstyle="description">
      <xsl:apply-templates select="@*|node()"/>
    </description>
  </xsl:template>
</xsl:stylesheet>

将生成这种结构良好的输出XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>    
  <description xmlns:aid="http://example.com/aid" aid:pstyle="description"/>
</root>

根据OP的评论更新:

  

这是有效的,但我可以没有输出xml   的xmlns:援助= “example.com/aid”;在标签说明?

您的评论以及您的问题标题“使用XSLT转换的XML中的特殊字符”表明您不了解XML命名空间。 aid:属性前的pstyle个字符不是特殊字符。它们是名称空间前缀。 XML中不需要命名空间,但是如果您要使用aid:这样的命名空间前缀,则必须为文档定义它(例如xmlns:aid="http://example.com/aid" namespace-valid 。有关名称空间有效和名称空间的一般说明,请参阅Namespaces in XML 1.0

如果您使用aid:前缀而未定义它,则该文档将不是名称空间有效的。 XSLT能够输出非命名空间有效的文档,甚至是非格式良好的XML,但几乎从来没有合法的理由这样做。请注意,如果您更喜欢这个定义,可以在root上进行定义。