我有一个包含各种组项的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;。
<?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>
答案 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>
如果那不是您想要的,请告诉我。
这是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>