xslt从<a></a>检索信息

时间:2012-08-22 09:10:18

标签: html xslt

<div>    
   <a href="M_TestNamespace_StoredNumber_Swap``1_2_890a5ef1.htm">
         Swap
         <span class="languageSpecificText">
            <span class="cs">&lt;</span>
            <span class="vb">(Of </span><span class="cpp">&lt;</span>
            <span class="fs">&lt;'</span><span class="nu">(</span>
         </span>
         T
         <span class="languageSpecificText">
            <span class="cs">&gt;</span>
            <span class="vb">)</span>
            <span class="cpp">&gt;</span>
            <span class="fs">&gt;</span>
            <span class="nu">)</span>
         </span>
    </a>
<div>

我想使用XSLT并将上面的内容翻译成如下结果:

<div>
   Swap(T)
<div>

仅供参考,“(”和“)”来自<span class="nu"/>

3 个答案:

答案 0 :(得分:0)

尝试如下:

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

    <xsl:template match="div">
        <xsl:element name="div">
            <xsl:value-of select="normalize-space(a/text()[1])"/>
            <xsl:value-of select="(.//span/span[@class='nu'])[1]/text()"/>
            <xsl:value-of select="normalize-space(a/text()[2])"/>
            <xsl:value-of select="(.//span/span[@class='nu'])[2]/text()"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

我认为<div>已正确关闭:)。

答案 1 :(得分:0)

您可能想要创建一个参数来保存'nu'值。

<xsl:param name="lang" select="'nu'" />

然后,您将能够提取特定语言的文本

<xsl:template match="span[@class='languageSpecificText']">
   <xsl:value-of select="span[@class=$lang]" />
</xsl:template>

这是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="html"/>

   <xsl:param name="lang" select="'nu'" />

   <xsl:template match="a">
      <xsl:apply-templates />
   </xsl:template>

   <xsl:template match="span[@class='languageSpecificText']">
      <xsl:value-of select="span[@class=$lang]" />
   </xsl:template>

   <xsl:template match="a/text()">
      <xsl:value-of select="normalize-space()" />
   </xsl:template>

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

当应用于您的示例XML时,输出以下内容

<div>Swap(T)</div>

将参数更改为“vb”,您将获得以下内容

<div>Swap(Of T)</div>

答案 2 :(得分:0)

生成所需结果的最短方法之一是:

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

 <xsl:template match="a">
  <div><xsl:apply-templates/></div>
 </xsl:template>
 <xsl:template match="a/text() | span[@class='nu']/text()">
     <xsl:value-of select="normalize-space()"/>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

<强>解释

  1. 所有文本节点都会被<xsl:template match="text()"/>忽略 - 这会有效地从输出中“删除”它们。

  2. 只有aspan[@class='nu']的文本节点子项被区别对待(用于在输出中生成文本节点),模板匹配:a/text() | span[@class='nu']/text()

  3. 使用标准XPath函数 normalize-space()

  4. 删除a文字节点子节点中不需要的空白区域