我有以下XML文件:
<p>
<rs key="rGR" n="1" id="id1">XXXXX</rs>
<rs key="rGR" n="2" xml:id="id3">YYYYYY</rs>, text text texts
<rs key="rGR" n="3" xml:id="id4">ZZZZZZ</rs>) text text text.
<rs key="r3" n="1" xml:id="id30">HHHHHH</rs>text text text text text.
text text
<rs key="r3" n="2" xml:id="id31">KKKKKK</rs>
<rs key="r3" n="3" xml:id="id32">PPPPPPP</rs> text text text
</p>
我想将标记rs[@n="1"]
替换为标记<ref>
,并仅保留@id
,将其他<rs>
替换为n != 1
。这应该有一些关键,因为我想用标记<ptr>
替换它,该标记具有包含@id
<rs>
n=1
的{{1}}的属性指针。
输出应该是这样的:
<p>
<ref id="id1">XXXXX</ref>(text text
<ptr pointer="id1">YYYYYY</ptr>, text text text
<ptr pointer="id1">ZZZZZZ</ptr>) text text text
<ref id="id30">HHHHHH</ref>
text text text text text.
text text
<ptr pointer="id30">KKKKKK</ptr>
<ptr pointer="id30">PPPPPPP</ptr> text text text
</ref>
</p>
我使用以下语法,但仅在n=1
<xsl:template match="rs[@n='1']">
<ref id="{@xml:id}">
<xsl:apply-templates/>
</ref>
</xsl:template>
答案 0 :(得分:1)
看起来您只需要添加第二个模板以匹配n != 1
<xsl:template match="rs[@n != '1']">
事实上,你可以写这个,因为它的条件
的优先级较低<xsl:template match="rs">
在其中,您可以xml:id
获取rs
n = 1
,如此
<ptr pointer="{../rs[@key=current()/@key and @n=1]/@xml:id}">
试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="rs[@n='1']">
<ref id="{@xml:id}">
<xsl:apply-templates/>
</ref>
</xsl:template>
<xsl:template match="rs">
<ptr pointer="{../rs[@key=current()/@key and @n='1']/@xml:id}">
<xsl:apply-templates/>
</ptr>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
如果您确实混合了@id
和@xml:id
属性,请尝试以下方法:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="rs[@n='1']">
<ref id="{@*[local-name() = 'id']}">
<xsl:apply-templates/>
</ref>
</xsl:template>
<xsl:template match="rs">
<ptr pointer="{../rs[@key=current()/@key and @n='1']/@*[local-name() = 'id']}">
<xsl:apply-templates/>
</ptr>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>