问题
我目前正在使用转换功能来获取给定的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方面的专家,因此希望您提供任何反馈意见。
答案 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”开头的部分。