用于将仅包含一个 <tr> 标记的 <table> 节点转换为仅 <div> 和 <span> 标记的 XSLT

Posted

技术标签:

【中文标题】用于将仅包含一个 <tr> 标记的 <table> 节点转换为仅 <div> 和 <span> 标记的 XSLT【英文标题】:XSLT for converting <table> nodes containing only one <tr> tag to just <div> and <span> tags 【发布时间】:2021-02-01 17:24:22 【问题描述】:

我是 XSLT 的新手,我正在尝试在 R 中使用 XSLT 包。我想搜索一个文档,找到所有只包含一行的节点(用标签定义),然后将这些表减少到只有和标签不会改变外观或丢失任何属性。

我在下面列出了其中一些表格的两个示例。为了帮助推进事情,这个 xpath 提出了所有符合这个标准的表“//table[count(tr) = 1]”。理想情况下,我只希望它是一个节点,然后嵌套在其中的几个节点以适应不同的字体/格式。也很乐意回答任何后续问题。

<table border="0" cellspacing="0" cellpadding="0" id="c721" style="border-collapse:collapse;width:100%"><tbody><tr id="c722">
<td valign="top" id="c723" style="white-space:nowrap;width:7.69%">
            <div id="c724" style="font-family:times new roman;font-size:10pt;font-style:normal;font-variant:normal;font-weight:normal;margin-bottom:0pt;margin-top:6pt;text-transform:none">
              <span id="c725">&nbsp; </span>
</div>
          </td>
          <td valign="top" id="c726" style="white-space:nowrap;width:5.24%">
            <div id="c727" style="font-family:times new roman;font-size:10pt;font-style:normal;font-variant:normal;font-weight:normal;margin-bottom:0pt;margin-top:6pt;text-transform:none">
              <span id="c728" style="font-family:times new roman;font-size:10pt;font-style:normal;font-variant:normal;font-weight:normal;text-transform:none">• </span>
</div>
          </td>
          <td valign="top" id="c729">
            <div id="c730" style="font-family:times new roman;font-size:10pt;font-style:normal;font-variant:normal;font-weight:normal;margin-bottom:0pt;margin-top:6pt;text-transform:none">
              <span id="c731" style="font-family:times new roman;font-style:italic">Glossary term 1</span><span id="c732" style="font-family:times new roman">— Definition 1. </span>
</div>
          </td>
        </tr></tbody></table>

<table border="0" cellspacing="0" cellpadding="0" id="c870" style="border-collapse:collapse;width:100%"><tbody><tr id="c871">
<td valign="top" id="c872" style="white-space:nowrap;width:10.47%">
            <div id="c873" style="font-family:times new roman;font-size:10pt;font-style:normal;font-variant:normal;font-weight:bold;margin-bottom:0pt;margin-top:18pt;text-transform:none">
              <span id="c874" style="font-family:times new roman;font-size:10pt;font-style:normal;font-variant:normal;font-weight:bold;text-transform:none">Glossary term 2 </span>
</div>
          </td>
          <td valign="top" id="c875">
            <div id="c876" style="font-family:times new roman;font-size:10pt;font-style:normal;font-variant:normal;font-weight:bold;margin-bottom:0pt;margin-top:18pt;text-transform:none">
              <span id="c877" style="font-family:times new roman;font-size:10pt;font-style:normal;font-variant:normal;font-weight:bold;text-transform:none">Definition 2 </span>
</div>
          </td>
        </tr></tbody></table>

【问题讨论】:

您能展示一下到目前为止您尝试过的 XSLT 代码吗?这将很有帮助,因此我们不必从头开始。还要清楚地显示此示例输入的所需输出,以便可以运行和测试可能的解决方案。 【参考方案1】:

试试这个

XSLT 2.0

<xsl:template match="*[local-name() = ('table', 'tbody', 'tr', 'td')][count(ancestor-or-self::table//tr) = 1]">
    <xsl:apply-templates/>
</xsl:template>

请参阅 https://xsltfiddle.liberty-development.net/nb9PtD4 的转换

XSLT 1.0

<xsl:template match="*[self::table or self::tbody or self::tr or self::td][count(ancestor-or-self::table//tr) = 1]">
        <xsl:apply-templates/>
</xsl:template>

请参阅 https://xsltfiddle.liberty-development.net/nb9PtD4/1 的转换

【讨论】:

以上是关于用于将仅包含一个 <tr> 标记的 <table> 节点转换为仅 <div> 和 <span> 标记的 XSLT的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 Jquery 在动态表中插入结束 </tr> 标记和开始 <tr> 标记吗?

Rails 3.2 <tr> 标签和 <td> 标签在渲染部分时被剥离

在HTML中,<TR>,<TH>,<TD>是啥标记?

td tr th 标记分别表示啥?

jQuery如果元素包含一些东西,做一些事情

表格的结构标记