【问题标题】:How to create an attribute node and attach it to output node..?如何创建属性节点并将其附加到输出节点..?
【发布时间】:2013-04-30 11:03:28
【问题描述】:

在以下场景中,我无法找到将属性节点附加到输出节点的方法..

输入 xml:

<record>
    <user>
        <field name="LastName">user33</field>
        <field name="FirstName">user33</field>
        <field name="Title"/>
        <field name="Email">user33@gmail.com</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">user33@gamil.com</value>
        </add-value>
        <add-value attr="Description">
            <value type="string">new user</value>
        </add-value>
    </add>

这是我目前拥有的 xslt 的 sn-p。

<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 和 class 作为 &lt;add&gt;.. 的属性。在这种情况下,&lt;xsl:attribute&gt; 不起作用。我需要对我的 xslt 进行哪些更改?

【问题讨论】:

    标签: xslt xpath xslt-1.0


    【解决方案1】:

    你不能给不是元素的东西添加属性。这是不尝试手动构建开始和结束标签的众多原因之一。试试这个:

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

    【讨论】:

    • 首先感谢您的回复..通过上述建议的更改,&lt;field name="Group Member"&gt; group1&lt;/field&gt; 也将作为我的输出的一部分出现,这是意料之外的..
    • 请尝试以上修改。
    • 我在您之前提交的回复中将preceding-sibling 替换为self,它运行良好。我会检查你所做的最新修改。
    猜你喜欢
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 2014-05-28
    相关资源
    最近更新 更多