我希望很快能够回答其他人的问题,但与此同时,我希望有人能够回答我的问题。
这是我有一个xml文件的示例......
<tr layoutcode="" type="categoryhead" level="2">
<td colname="1">Common stocks 87.33%[This Tag]</td> (b)
<td colname="2"/>
<td colname="3"/>
<td colname="4"/>
<td colname="5"/>
</tr>
<tr layoutcode="" type="categoryhead" level="3">
<td colname="1"><2>Health care&lt;softreturn&gt;21.27%</td>
<td colname="2"/>
<td colname="3"/>
<td colname="4"/>
<td colname="5"/>
</tr>
<tr layoutcode="" type="detail" level="4">
<td colname="1"/>
<td colname="2">Gillan Sciences [Asset Type]</td> (a)
<td colname="3">26,522,142</td>
<td colname="4">1,132,761</td>
<td colname="5">4.12</td>
</tr>
....而我想做的是采取&#39; td&#39;标记,在此表示为(a)并替换文本&#39;资产类型&#39;使用第一个父母的文字&#39; tr&#39;具有type =&#34; categoryhead&#34;的属性的节点;和一个孩子一起玩耍包含文本的节点&#39;此标记&#39;由(b)代表。换句话说,原始XML具有&#39; Gillan Sciences [资产类型]&#39;我希望能够展示Gillan Sciences Common股票&#39;。
这是我到目前为止所拥有的xslt文件,如果父节点是直接父节点或者我指定了&#39;级别,它只会执行任何操作。属性。理想情况下,我希望查询能够向上游,直到找到第一个&#39; tr&#39;类型为&#39; categoryhead&#39;的父节点和一个孩子的#t;带有&#39;此标记的节点&#39;在文中......
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="v4:td[contains(text(),'Asset Type')]/text()">
<xsl:variable name="ReplacementTag" select="'Asset Type'"></xsl:variable>
<xsl:variable name="lev" select="../@level"/>
<xsl:call-template name="replace-this">
<xsl:with-param name="text" select="."/>
<xsl:with-param name="replace" select="$ReplacementTag" />
<xsl:with-param name="by" select="../../preceding-sibling::v4:tr[@type = 'categoryhead'][1]/v4:td[contains(text(), 'This Tag')]/text()" />
</xsl:call-template>
</xsl:template>
&#39; v4&#39;是我正在使用的命名空间的缩写。
非常感谢任何想法。 非常感谢, 亚历克斯。
答案 0 :(得分:0)
下一个XSLT将完成大部分工作,但不会从文本中删除87.33%
:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pref="http://example.org/uri" xmlns="http://example.org/uri" exclude-result-prefixes="pref">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="pref:tr[@type = 'detail']/pref:td[contains(., '[Asset Type]')]">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:value-of select="substring-before(., '[Asset Type]')" />
<xsl:value-of select="substring-before((preceding::pref:tr[@type = 'categoryhead']/pref:td[contains(., '[This Tag]')])[last()], '[This Tag]')" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>