我的目标是使用下面的XSLT将两个节点dataDS.select(col("count")).printSchema;
root
|-- count: integer (nullable = true)
和<style>
添加到我的SVG文件中,但是我面临两个问题。首先,在添加<whatever>
时,它包含了三个我不想要的<style>
属性:
xmlns
然后,它不会添加我的第二个节点<style xmlns=""
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:svg="http://www.w3.org/2000/svg">.val{--valence: #4599a3}</style>
。
我该如何解决?
<whatever>
答案 0 :(得分:1)
命名空间是继承的。要摆脱它们,您需要设置另一个名称空间或一个空名称空间(创建xmlns=""
意味着没有名称空间/空名称空间)。删除
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:svg="http://www.w3.org/2000/svg"
解决此问题的一种方法是使用xsl:element
显式定义元素:
<xsl:element name="whatever" namespace="">foo</xsl:element>
现在,元素上只剩下xmlns=""
。要同时删除此名称,请将名称空间设置为默认名称空间-此处可能是http://www.w3.org/2000/svg
<xsl:element name="whatever" namespace="http://www.w3.org/2000/svg">foo</xsl:element>
现在该元素显示为<whatever>foo</whatever>
,但请记住,它实际上具有继承的默认名称空间。
然后,它不会添加我的第二个节点
<whatever>
。
之所以会这样,是因为您有两个模板具有相同的匹配规则match="svg:title"
。使匹配规则唯一,它将起作用。
答案 1 :(得分:1)
如果要在SVG命名空间中添加元素,则需要使用它,因此,如果整个样式表都应创建SVG元素,并且已经在根元素上声明了它,就像使用
new
您可以使用<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:svg="http://www.w3.org/2000/svg" version='1.0'>
创建SVG style
元素:
svg:style
或者,您可以在样式表的根元素上放置默认的名称空间声明 <xsl:template match="svg:title">
<xsl:copy-of select="."/>
<svg:style>.val{--valence: #4599a3}</svg:style>
</xsl:template>
,例如
xmlns="http://www.w3.org/2000/svg"
<xsl:stylesheet
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version='1.0'>
..
<xsl:template match="svg:title">
<xsl:copy-of select="."/>
<style>.val{--valence: #4599a3}</style>
</xsl:template>
不需要。
对于您在XPath表达式或XSLT匹配模式的根元素上声明的其他名称空间声明,但又不想将其用于结果元素,可以在{{1}上使用xsl:element
属性} / exclude-result-prefixes
例如xsl:stylesheet
xsl:transform