如何创建属性节点并将其附加到输出节点..?

问题描述:

我无法想出一个办法附加属性节点在以下情况下输出节点..如何创建属性节点并将其附加到输出节点..?

输入XML:

<record> 
    <user> 
     <field name="LastName">user33</field> 
     <field name="FirstName">user33</field> 
     <field name="Title"/> 
     <field name="Email">[email protected]</field> 
     <field name="WorkPhone"/> 
     <field name="Fax"/> 
     <field name="Description">new user</field> 
     <field name="Group Member"> group1</field> 
    </user> 
</record> 

预期输出:

<add class="user" id-val="user33 user33" >   
     <add-value attr="LastName"> 
      <value type="string">user33</value> 
     </add-attr> 
     <add-value attr="FirstName"> 
      <value type="string">user33</value> 
     </add-value> 
     <add-value attr="Email"> 
      <value type="string">[email protected]</value> 
     </add-value> 
     <add-value attr="Description"> 
      <value type="string">new user</value> 
     </add-value> 
    </add> 

这是我到目前为止的xslt代码片段。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:variable name="lessThan" select="'&#x3C;'"/> 
    <xsl:variable name="GreaterThan" select="'&#x3E;'"/> 

    <xsl:template match="user"> 
    <xsl:variable name="temp1" select="concat(field[@name=$srcdn-field-name1],' ')"/> 
    <xsl:variable name="temp2" select="concat($temp1,field[@name=$srcdn-field-name2])"/> 
    <xsl:variable name="src" select="translate($temp2,'+=,.\','-----')"/> 

    <xsl:value-of disable-output-escaping="yes" select="$lessThan"/> 
    <xsl:text>add</xsl:text> 
    <xsl:value-of disable-output-escaping="yes" select="$GreaterThan"/> 

    <!-- it is required to add attribute id-val to element <add> with value of $src--> 

    <xsl:for-each select="field[string()]"> 
     <xsl:variable name="fieldValue" select="normalize-space(.)"/> 
     <xsl:choose> 
     <xsl:when test="@name !='Group Member'"> 
      <add-value attr="{@name}"> 
      <value type="string"> 
       <xsl:value-of select="$fieldValue"/> 
      </value> 
      </add-value> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of disable-output-escaping="yes" select="$lessThan"/> 
      <xsl:text>/add</xsl:text> 
      <xsl:value-of disable-output-escaping="yes" select="$GreaterThan"/> 

      <!--perform some other operations--> 

     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

现在,我的要求是有ID-VAL和类为<add>属性。在此背景下,<xsl:attribute>不工作。我需要对xslt进行哪些更改?

您不能将属性添加到不是元素的东西。这是不尝试手动构建开始和结束标记的许多原因之一。试试这个:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="user"> 
    <xsl:variable name="temp1" select="concat(field[@name=$srcdn-field-name1],' ')"/> 
    <xsl:variable name="temp2" select="concat($temp1,field[@name=$srcdn-field-name2])"/> 
    <xsl:variable name="src" select="translate($temp2,'+=,.\','-----')"/> 

    <add class="user" id-val="{$src}"> 

     <!-- it is required to add attribute id-val to element <add> with value of $src--> 

     <xsl:for-each select="field[string()] 
           [not((. | preceding-sibling::field) 
              [@name = 'Group Member'])]"> 
     <add-value attr="{@name}"> 
      <value type="string"> 
      <xsl:value-of select="normalize-space()"/> 
      </value> 
     </add-value> 
     </xsl:for-each> 

    </add> 
    </xsl:template> 
</xsl:stylesheet> 
+0

首先感谢replying..With上述建议的更改的,**'组别1'**也来为我的输出的一部分,该预计不会.. – FarSh018 2013-04-30 12:20:54

+0

请尝试上述修改。 – JLRishe 2013-04-30 12:40:47

+0

在你以前提交的答复中,我用'self'替换了'兄弟之前',它工作正常。我会检查你所做的最新修改。 – FarSh018 2013-04-30 12:51:35