如何在xslt中选择当前节点的第一个子节点的名称

时间:2015-12-04 03:34:32

标签: xml xslt

我有一个包含各种组项的xml,其中一些包含" row"元素:

<foo id="2">
   <row>13/<row>
</foo>
<xxx id="3">
  <text>aaa</text>
</xxx>
<aaa id="4">
  <row>17</row>
</aaa>

必须转换嵌套<row>的那些:&#34; row&#34;应该包含在<value>中,并从&#34;行&#34;中复制属性。到了&#34;价值&#34;

<foo> 
    <value id="4"> 
        <row>13</row> 
    </value> 
</foo>

为了做到这一点,我必须找到我当前的元素是否有一个名为&#34; row&#34;的孩子。在xslt中有没有通用的方法呢?我试过test="name(node()/*[1])='row'",但它没有选择任何东西 这是使用test =&#34; row&#34;。

的xsl
<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <xsl:choose>
        <xsl:when test="row">
            <xsl:element name="attribute"> 
                <xsl:attribute name="id">Sucess</xsl:attribute>
            </xsl:element>
        </xsl:when>
        <xsl:otherwise>
            <xsl:element name="attributeNone"> 
                <xsl:attribute name="id">Failure</xsl:attribute>
            </xsl:element>
        </xsl:otherwise></xsl:choose>
    </xsl:template>
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/> 
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

鉴于此输入文件......

<t>
  <foo id="2">
    <row>13</row>
  </foo>

  <xxx id="3">
    <text>aaa</text>
  </xxx>

  <aaa id="4">
    <row>17</row>
  </aaa>
</t>

...这个XSLT 2.0样式表......

<xsl:transform
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0">
<xsl:output omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*" />

<xsl:template match="*[row]">
  <xsl:copy>
    <xsl:apply-templates select="self::*/@* except @id , * except row" />
    <value id="{@id}"> 
      <xsl:apply-templates select="row" /> 
    </value> 
  </xsl:copy>
</xsl:template>

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

</xsl:transform>

...会产生输出......

<t>
   <foo>
      <value id="2">
         <row>13</row>
      </value>
   </foo>
   <xxx id="3">
      <text>aaa</text>
   </xxx>
   <aaa>
      <value id="4">
         <row>17</row>
      </value>
   </aaa>
</t>

如果那不是您想要的,请告诉我。

更新1:

这是XSLT 1.0版本......

<xsl:transform
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">
<xsl:output omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*" />

<xsl:template match="*[row]">
  <xsl:copy>
    <xsl:apply-templates select="@*[ local-name() != 'id']" />
    <xsl:apply-templates select="*[ not( self::row)]" />
    <value id="{@id}"> 
      <xsl:apply-templates select="row" /> 
    </value> 
  </xsl:copy>
</xsl:template>

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

</xsl:transform>