2014-01-27 25 views
-1

我有XML节点如下添加缺少的节点XML:使用XSL

<AA title="xx"> 
    <BB/> 
    <AA><title>yy</title></AA> 
    <AA title="zz"></AA> 
</AA> 

titleAA节点有时是一个属性,有时它是一个子节点。我需要将它全部装入一个节点。这意味着如果标题节点缺失,我需要创建一个并从属性复制值。

我该如何使用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> 
+2

该错误消息“‘的xsl:的valueOf’不能是‘标题’元素的孩子。” –

+0

什么,确切地说,“不起作用”是什么意思?它有什么作用?你有没有看到任何错误?您是否尝试修复您的XSL处理器报告的任何错误?一旦你修复了它们会发生什么? –

回答

2

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> 
+0

谢谢,但我得到以下错误:[xslt] addtitle.xsl:32:致命错误!在包含元素[xslt] – user1749707

+0

@ user1749707的子元素后面不能创建属性节点(类):我正在使用.NET 2.0和XslTransform类。如果你使用不同的技术,也许你想重新发布你的问题,指定技术(使用标签),并给我们的部分源代码。 –

+0

明白了。我在,现在它工作...非常感谢 – user1749707