使用其属性值替换另一个标记

时间:2016-05-03 12:32:34

标签: xml xslt

我有以下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>

1 个答案:

答案 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>