对于具有名称空间的转换XML文件,我必须在XSL文件中使用此名称空间。 但这不起作用。
这是我的XML文件:
<?xml version="1.0" encoding="utf-8"?>
<data xmlns="http://www.aspzone.com/xml/serialization">
<parent>
<string xmlns="">AAA</string>
</parent>
<nb>
<string >2</string>
</nb>
<child1>aaa-1
<s1><string >1aaa-1 </string></s1>
<s1><string >2aaa-1</string></s1>
</child1>
<child1>aaa-2</child1>
<parent>
<string >BBB</string>
</parent>
<nb>
<string>1</string>
</nb>
<child2>bbb-1</child2>
</data>
名称空间为“ ser”的XSL文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ser="http://www.aspzone.com/xml/serialization" >
<xsl:output indent="yes"/>
<xsl:template match="ser:data">
<xsl:copy>
<xsl:apply-templates select="ser:parent"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ser:parent[string = 'AAA']">
<xsl:copy>
<xsl:variable name="n" select="following-sibling::ser:nb[1]"/>
<xsl:copy-of select="string | following-sibling::ser:nb[1] | following-sibling::ser:child1[position() <= $n]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ser:parent[string != 'AAA']">
<xsl:copy>
<xsl:variable name="n" select="following-sibling::ser:nb[1]"/>
<xsl:copy-of select="string | following-sibling::ser:nb[1] | following-sibling::ser:child2[position() <= $n]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
当我使用前缀“ ser:”时,它会产生:
<?xml version="1.0" encoding="UTF-8"?>
<data xmlns="http://www.aspzone.com/xml/serialization">
<parent>
<string xmlns="">AAA</string>
<nb>
<string>2</string>
</nb>
<child1>aaa-1
<s1><string >1aaa-1</string></s1>
<s1><string >2aaa-1</string></s1>
</child1>
<child1>aaa-2</child1>
</parent>
BBB
</data>
预期是
<?xml version="1.0" encoding="UTF-8"?>
<data>
<parent>
<string>AAA</string>
<nb>
<string>2</string>
</nb>
<child1>aaa-1
<s1><string >1aaa-1 </string></s1>
<s1><string >2aaa-1</string></s1>
</child1>
<child1>aaa-2</child1>
</parent>
<parent>
<string>BBB</string>
<nb>
<string>1</string>
</nb>
<child2>bbb-1</child2>
</data>
不检索childe2节点... 怎么了 ? 当不使用名称空间时,它会很好地工作。
最诚挚的问候
答案 0 :(得分:2)
未检索childe2节点...出了什么问题?效果很好 当不使用名称空间时。
可能是因为您的匹配ser:parent[string != 'AAA']
从未匹配任何内容。
这是因为在您的第二个ser:parent
中,子项string
在默认名称空间http://www.aspzone.com/xml/serialization
中(而string
在第一个{{1 }}。
考虑改用xsl:key ...
ser:parent
答案 1 :(得分:0)
xsl:copy
指令产生的元素名称与原始名称相同:即,相同的本地名称和相同的名称空间。因此,如果您在输入中输入{http://www.aspzone.com/xml/serialization}data
,并且在输出中想要{}data
(更改名称空间,并因此更改名称),则不能使用xsl:copy
;您需要使用xsl:element
。