XML中的命名空间会阻止正确的XSL执行

时间:2016-06-17 10:19:03

标签: xml xslt xml-namespaces

我的XML文件包含几个名称空间,这些名称空间阻止了我的xsl的正确执行。删除xml文件中的命名空间是使用xsl的唯一选项。但我想将原始xml文件与命名空间一起使用。我应该如何操纵我的xsl才能工作?

XML:

<body>

XSL:

<?xml version="1.0" encoding="utf-8"?>
<SymbolLibrary xmlns="http://relaxng.org/ns/structure/1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://relaxng.org/ns/structure/1.0 
file:/D:/DevPool/MiStyle/Src/SymbolLibrary_1_0_0_1.xsd">

       <IconComponents>
          <IconComponent Id="10001">
             <Name>PIK-PAR-Eiffelturm</Name>
             <IconElems>
                <BezierPolygon>
                   <ColorId>198</ColorId>
                </BezierPolygon>
             </IconElems>
          </IconComponent>
        <//IconComponents>

任何人都可以给我一个提示吗?

1 个答案:

答案 0 :(得分:0)

&#34;防止正确的XSL执行&#34;这是一个很好的措辞,但是你可能怀疑你的xslt并没有告诉它正确的做法

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:relax="http://relaxng.org/ns/structure/1.0">
    <xsl:output omit-xml-declaration="no" indent="yes"/>
    <xsl:strip-space elements="*"/>  

然后放松:放到模板中的所有位置,选择和引用这样一个标签的值(在输入xml中没有命名空间)

请注意,这将为您提供名称空间为relax:

的输出

为避免这种情况,请使用

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

<xsl:template match="relax:IconComponent[@Id='10001']//relax:ColorId/text()[.='210']">21</xsl:template>