XSLT找不到表内的属性

时间:2018-07-19 15:35:22

标签: html xml xslt alignment tr

问题

我目前正在使用转换功能来获取给定的HTML文件,并使用XSLT 2.0将其转换为自定义XML。除表格内标签的align属性外,我已经成功转换了所有内容。

我当前遇到问题的HTML文档如下:

<table frame="none" style="margin-left:0">
   <tbody>
      <tr align="left">
         <th style="text-align:left; vertical-align:top; border-right:1 solid black; border-bottom:1 solid black">Yeah</th>
         <th style="text-align:left; vertical-align:top; border-right:1 solid black; border-bottom:1 solid black">4321</th>
      </tr>
      <tr align="left">
         <th style="text-align:left; vertical-align:top; border-right:1 solid black; border-bottom:1 solid black">Blah</th>
         <th style="text-align:left; vertical-align:top; border-right:1 solid black; border-bottom:1 solid black">1234<sup>3</sup></th>
      </tr>
   </tbody>
</table>

首先,我使用以下方式定位了表格:

<xsl:template match="table">

然后,我遍历表格并使用select和when情况获取转换所需的各种标记和属性。但是,当我遇到以下情况时,总是尝试使用以下方法获取align属性时:

<xsl:when test="tbody/tr[1]/@align">
    <xsl:attribute name="align"><xsl:value-of select="tbody/tr[1]/@align"/></xsl:attribute>
</xsl:when>

问题排查

进行一些调试后,我发现如果使用以下情况,它会找到标记:

<xsl:when test="tbody/tr[1]">
    <xsl:attribute name="align"><xsl:value-of select="'Found TR'"/></xsl:attribute>
</xsl:when>

我还测试了google chrome中的XPath,发现tbody / tr [1] / @ align路径有效并且可以正常工作。

我发现一件奇怪的事情是,由于某种原因,在google chrome开发工具的样式标签下,align属性被列为:

tr[Attributes Style] {
    text-align: -webkit-left;
} 

发现这一点后,我尝试在大小写仍然失败时使用以下内容:

<xsl:when test="tbody/tr[1]/@text-align">
        <xsl:attribute name="align"><xsl:value-of select="tbody/tr[1]/@text-align"/></xsl:attribute>
</xsl:when>

TLDR::我可以在表内定位tr标签,但不能使用XSLT 2.0来获取align属性。

我显然不是XSLT方面的专家,因此希望您提供任何反馈意见。

1 个答案:

答案 0 :(得分:0)

在第二个示例中,text-align不是属性。 style是属性,text-align只是属性值的一部分。看来<tr align="left">在XSLT掌握之前已经转换成<tr style="text-align: left" >

从样式属性中提取text-align的“值”是棘手的,但是可能的。在使用XSLT 2.0时,您可以执行以下操作...

  <xsl:variable name="tokens" select="tokenize(tbody/tr[1]/@style, ';')" />
  <xsl:choose>
    <xsl:when test="contains(tbody/tr[1]/@style, 'text-align')">
      <xsl:attribute name="align" select="substring-after($tokens[substring-before(., ':') = 'text-align'], ':')" />
    </xsl:when> 
  </xsl:choose>

因此,它用;分隔符分割属性值,并找到以“ text-align”开头的部分。