xslt从父节点查找文本

时间:2014-04-14 13:30:20

标签: xml xslt xpath

我希望很快能够回答其他人的问题,但与此同时,我希望有人能够回答我的问题。

这是我有一个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">&lt;2&gt;Health care&amp;lt;softreturn&amp;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;是我正在使用的命名空间的缩写。

非常感谢任何想法。 非常感谢, 亚历克斯。

1 个答案:

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