我有一个XML文件,其中包含以下内容:
<contents id="MLC1" name="Requirement1" uri="C:\abc.txt" xsi:type="requirement:Requirement" type="">
<contents id="GO1" name="Goal1" uri="C:\abc.txt" xsi:type="goal:Goal">
我正在尝试匹配XML文件中的所有元素,该文件具有属性xsi:type="requirement:Requirement"
,以便我可以向其添加名为“label”的新属性。这是我的样式表:
<xsl:template match="//contents[@type='requirement:Requirement']">
<contents>
<xsl:attribute name="label">
<xsl:value-of select="@name"/>
</xsl:attribute>
<xsl:apply-templates select="node()|@*"/>
</contents>
</xsl:template>
我已经在样式表中声明了xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
,但它似乎无法匹配任何内容。我怀疑是因为原始xml中还有另一个属性“type”,它没有xsi名称空间。有没有人有任何建议我应该用什么来正确匹配这个元素?
答案 0 :(得分:1)
通常,您需要使用名称空间前缀来正确选择属性:
<xsl:template match="//contents[@xsi:type='requirement:Requirement']">
如果您使用的是模式感知XSLT处理器,xsi:type
属性可能具有特殊含义,需要进行相应处理。 See here for more info,但基本上你需要这样做:
<xsl:template match='//contents[@xsi:type =
QName("http://requirement/namespace/url/goes/here/", "Requirement")]'>
答案 1 :(得分:1)
首先,使您的输入XML文档格式良好:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<contents id="MLC1" name="Requirement1" uri="C:\abc.txt"
xsi:type="requirement:Requirement" type=""/>
<contents id="GO1" name="Goal1" uri="C:\abc.txt" xsi:type="goal:Goal"/>
</root>
然后,请务必在xsi
上使用type
名称空间前缀:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="//contents[@xsi:type='requirement:Requirement']">
<contents>
<xsl:attribute name="label">
<xsl:value-of select="@name"/>
</xsl:attribute>
<xsl:apply-templates select="node()|@*"/>
</contents>
</xsl:template>
</xsl:stylesheet>
然后您将获得以下输出XML:
<?xml version="1.0" encoding="UTF-8"?>
<contents xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
label="Requirement1">MLC1Requirement1C:\abc.txtrequirement:Requirement</contents>