有人可以提供帮助吗?我正在重命名节点,但是没有格式化。我的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>
提前感谢您的帮助。
答案 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
上进行定义。