仅在 Tbody 中用于 table 内容替换的 Xslt

Xslt for table content replacement only in Tbody

在下面的场景中,你能帮我们解决一下吗? 我们需要以下场景的 xsl 代码。

我们需要在 Thead 中检索 para 内的 ref 标签 我们需要删除 Tbody 中 para 内的 ref 标签。 对于最后一个单元格,我们不应该执行此引用删除。即)应该表现得像 thead

示例输入:

<xml>
<Table>
    <thead>
        <Row>
            <Cell>
                <para id=4> 
                    <ref>A</ref>
                </para>
            </Cell>
        </Row>
    </thead>
    <tbody>
        <Row>
            <Cell>
                <para id=1> 
                    <ref>b</ref>
                </para>
            </Cell>
            .
            .
            <Cell>
                <para id=6> 
                    <ref>retrive</ref>
                </para>
            </Cell>
        </Row>
        <Row>
            <Cell>
                <para id=2> 
                    c
                </para>
            </Cell>
            .
            .
            <Cell>
                <para id=7> 
                    <ref>retrive</ref>
                </para>
            </Cell>
        </Row>
        <Row>
            <Cell >
                <para id=3> 
                    <ref>d</ref>
                    <ref>e</ref>
                </para>
            </Cell>
            .
            .
            <Cell>
                <para id=8> 
                    <ref>retrive</ref>
                </para>
            </Cell>
        </Row>
    </tbody>
</table>

预期输出:

   <xml>
  <Table>
    <thead>
        <Row>
            <Cell>
                <para id=4> 
                    <ref>A</ref>   (No change in thead)
                </para>
            </Cell>
        </Row>
    </thead>
    <tbody>
        <Row>
            <Cell>
                <para id=1>   (para attribute should be retrieved)
                    b    (ref tag should be removed but content should be retrieved)
                </para>
            </Cell>
            .
            .
            <Cell>
                <para id=6> 
                    <ref>retrieve</ref>  (Should retrieve ref tag with value)
                </para>
            </Cell>
        </Row>
        <Row>
            <Cell>
                <para id=2> 
                    c
                </para>
            </Cell>
            .
            .
            <Cell>
                <para id=7> 
                    <ref>retrieve</ref>  (Should retrieve ref tag with value)
                </para>
            </Cell>
        </Row>
        <Row>
            <Cell>
                <para id=3> 
                    d
                    e
                </para>
            </Cell>
            .
            .
            <Cell>
                <para id=8> 
                    <ref>retrieve</ref>  (Should retrieve ref tag with value)
                </para>
            </Cell>
        </Row>
    </tbody>
</table>

通过调整您的输入 XML 使结束 table 标签与开始 table 标签匹配并将 id 的值用引号引起来,以下 XSLT

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml"  omit-xml-declaration="no"
encoding="UTF-8" indent="yes" />
 <xsl:strip-space elements="*"/>
  <xsl:template match="table">
    <xsl:apply-templates/>
  </xsl:template>
  <xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="tbody/Row/Cell[position()!=last()]/para/ref">
    <xsl:value-of select="."/>
  </xsl:template>
</xsl:transform>

当应用到这个更正后的输入时 XML 产生输出

<?xml version="1.0" encoding="UTF-8"?>
<Table>
  <thead>
    <Row>
     <Cell>
        <para id="4">
           <ref>A</ref>
        </para>
     </Cell>
   </Row>
 </thead>
 <tbody>
  <Row>
     <Cell>
        <para id="1">b</para>
     </Cell>
     <Cell>
        <para id="6">
           <ref>retrieve</ref>
        </para>
     </Cell>
  </Row>
  <Row>
     <Cell>
        <para id="2"> 
                c
            </para>
     </Cell>
     <Cell>
        <para id="7">
           <ref>retrieve</ref>
        </para>
     </Cell>
  </Row>
  <Row>
     <Cell>
        <para id="3">de</para>
     </Cell>
     <Cell>
        <para id="8">
           <ref>retrieve</ref>
        </para>
     </Cell>
    </Row>
  </tbody>
</Table>

<xsl:template match="tbody/Row/Cell[position()!=last()]/para/ref"> 匹配 tbody 中的所有 Cell 元素,除了最后一个 - position()!=last() - 并用它的值替换 ref 属性。