使用XSL在XML中添加缺少的节点

时间:2014-01-27 12:03:13

标签: xml xslt xpath

我有如下的XML节点:

<AA title="xx">
   <BB/>
   <AA><title>yy</title></AA>
   <AA title="zz"></AA>
</AA> 
title节点内的

AA有时是属性,有时它是子节点。我需要把它全部装进一个节点。这意味着如果标题节点丢失,我需要创建一个并从属性中复制值。

如何使用XSL进行操作?我试图使用它,但它不起作用:

   <xsl:template match="@* | node()">
     <xsl:copy>
       <xsl:apply-templates select="@* | node()"/>
     </xsl:copy>
   </xsl:template>

   <xsl:template match="AA">
     <xsl:copy>
       <xsl:if test="not(/title)">
          <title><xsl:valueOf select="@title"/></title>
       </xsl:if>
       <xsl:apply-templates select="@* | node()"/>
     </xsl:copy>
   </xsl:template>

1 个答案:

答案 0 :(得分:3)

xsl:valueOf不是XSL。将其替换为xsl:value-of

然后转换原则上会起作用,但最终会出现重复的定义。要删除重复项,请将not(/title)更改为not(./title)

这是我的完整转型:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xml:space="default" exclude-result-prefixes="" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" omit-xml-declaration="no" indent="yes" />
  <xsl:template match="AA">
    <xsl:copy>
      <xsl:if test="not(./title)">
        <title>
          <xsl:value-of select="@title" />
        </title>
      </xsl:if>
      <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
  </xsl:template>
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>