0

给定 XML,例如:

<a>
  <b>
    <c>some keyword</c>
  </b>
</a>

如果节点 c 包含文本“关键字”,我需要将新节点添加到 a 的父节点,所以它看起来像

<a>
  <b>
    <c>some keyword</c>
  </b>
</a>
<x> new node X </x>

我可以将文本与表达式匹配:

<xsl:template match="//a/b/c[matches(text(),'\.*keyword\.*')]">
  <xsl:copy-of select="."/>
  <xsl:element name="x">
    <xsl:text> new node </xsl:text>
  </xsl:element>
</xsl:template>

这导致

<a>
  <b>
    <c>some keyword</c>
    <x> new node X </x>
  </b>
</a>

我该如何解决?

4

1 回答 1

1

您必须x在匹配a的父级时添加元素。您可以引用谓词中的任何子元素或属性。我的意思是,您必须在复制时查看 a 的父级内部的内容。在复制 a、b 或 c 元素时这样做已经太晚了。

以下样式表应该可以解决问题。我现在没有任何支持 XSLT2.0 的处理器,所以我无法检查它,但您应该能够看到其中的逻辑。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="*">
    <xsl:element name="{name()}">
        <xsl:apply-templates ></xsl:apply-templates>
    </xsl:element>
</xsl:template>
<xsl:template match="//*[matches(a/b/c/text() , 'keyword')]">
    <xsl:element name="{name()}">
        <xsl:apply-templates ></xsl:apply-templates>
        <xsl:element name="x">
            <xsl:text> new node </xsl:text>
        </xsl:element>
    </xsl:element>
</xsl:template>

于 2012-06-06T20:26:18.107 回答