我遇到使用xsl将xml转换为xml的问题。我发现了问题的来源,但仍然不知道如何解决它。
<?xml version="1.0" encoding="UTF-8"?>
<tells uri="" xmlns="http://dl.kr.org/dig/2003/02/lang">
<impliesc>
<catom name="name1"/>
<catom name="name2"/>
</impliesc>
<impliesc>
<catom name="name3"/>
<catom name="name4"/>
</impliesc>
</tells>
我认为问题来自这一行
<tells uri="" xmlns="http://dl.kr.org/dig/2003/02/lang">
如果我删除“uri =”“xmlns =”http://dl.kr.org/dig/2003/02/lang“”并只留下
"<tells>"
一切都很完美。但有没有办法在不删除的情况下对其进行转换?
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/">
<xsl:element name="tells">
<xsl:for-each select="./tells/impliesc">
<xsl:element name="impliesc">
<xsl:for-each select="./tells/impliesc/catom">
<xsl:element name="catom">
<xsl:attribute name="name">
<xsl:value-of select="./tells/impliesc/individual/@name"/>
</xsl:attribute>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:3)
你是对的:你的转换不起作用的原因是你在tells
元素上有一个命名空间声明。
要使此特定问题消失,您需要让XSLT知道命名空间,并告诉它它尝试转换的tells
元素属于该命名空间。最常见的方法是在xsl:stylesheet
元素中声明一个名称空间前缀,然后在XPath中使用该前缀,例如:
<xsl:stylesheet xmlns:n="http://dl.kr.org/dig/2003/02/lang" ... >
...
<xsl:template match="/">
<output>
<xsl:apply-templates select="//n:tells"/>
</output>
</xsl:template>
<xsl:template match="n:tells">
...
</xsl:template>
<xsl:stylesheet>
样式表顶部的xmlns:n
属性告诉XSLT处理器存在“http://dl.kr.org/dig/2003/02/lang”命名空间,并且{{1前缀是它的缩写。在n:
和select
属性中,match
前缀告诉XSLT处理器,当它在寻找名为n:
的元素时,它应该查找具有该名称的元素tells
命名空间。
XML命名空间是XML技术的重要组成部分,人们在学习XML时经常会忽略它们 - 它们很复杂而且不太直观,而且你可能会在很长一段时间内忽略它们XML的速度。但有一点,你再也无法承担名称空间不存在的简化假设,而且你就是这样。
答案 1 :(得分:0)
处理命名空间时,必须在变换中声明它们;否则您将无法正确选择文档节点。
答案 2 :(得分:0)
没有看到您的XSLT代码,我们无法修复它。尽管如此,xmlns="http://dl.kr.org/dig/2003/02/lang"
表示tells
元素及其后代元素位于该命名空间中,因此您的XSLT需要将其考虑在内。使用XSLT 1.0,样式表需要将前缀绑定到名称空间URI,并在XPath表达式和XSLT匹配模式中使用该前缀来限定元素名称,例如。
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:df="http://dl.kr.org/dig/2003/02/lang"
exclude-result-prefixes="df"
version="1.0">
<-- examples -->
<xsl:template match="df:tells">
<foo>
<xsl:apply-templates/>
</foo>
</xsl:template>
<xsl:template match="df:impliesc">
<bar>
<xsl:apply-templates select="df:catom[1]"/>
</bar>
</xsl:template>
</xsl:stylesheet>