删除节点副本中的某些节点

时间:2018-06-11 15:20:30

标签: html xml xslt

如何复制整个元素但只删除部分孩子? 我想要复制div#about,但我想从中删除table元素。

输入HTML:

<html>
  <body>
    <div class="content-header">
      <h1>Title</h1>
    </div>
    <div id="about">
      <h1>About</h1>
      <table>...</table>
      <p>Bla bla bla</p>
      <table>...</table>
      <p>The end</p>
    </div>
  </body>
</html>

XSLT:

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <div class="article">
            <h1>
              <xsl:value select="//div[@class='content-header']/h1/text()"/>
            </h1>

            <div>
                <xsl:copy-of select="//div[@id='about']"/>
               <!-- Here should render the entire div#about without the tables -->
            </div>

        </div>
    </xsl:template>

    <xsl:output method="html" indent="yes" omit-xml-declaration="yes"/>
</xsl:transform>

1 个答案:

答案 0 :(得分:2)

首先将身份模板添加到您的XSLT

<xsl:mode on-no-match="shallow-copy"/>

(或者,如果您使用的是XSLT 3.0,则可以使用table

然后添加另一个模板以忽略<xsl:template match="div[@id='about']/table" /> 元素

xsl:copy-of

最后,将xsl:apply-templates替换为table以允许匹配这些模板,从而确保<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" indent="yes" omit-xml-declaration="yes"/> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()" /> </xsl:copy> </xsl:template> <xsl:template match="div[@id='about']/table" /> <xsl:template match="/"> <div class="article"> <h1> <xsl:value-of select="//div[@class='content-header']/h1/text()"/> </h1> <div> <xsl:apply-templates select="//div[@id='about']"/> </div> </div> </xsl:template> </xsl:transform> 元素不会被复制。

试试这个XSLT

@RunWith(Parameterized.class)
public class ExampleInstrumentedTest extends TestCase {
    private MainActivity ma = new MainActivity();

    @Parameterized.Parameter(0)
    public float expectedResult;
    @Parameterized.Parameter(1)
    public float firstNum;
    @Parameterized.Parameter(2)
    public float secondNum;

    @Parameterized.Parameters(name = "{index}: testAdd {0} = ({1}+{2})")
    public static Collection<Object[]> testData(){

        Object[][] data = new Object[][]{ {6,2,4}, {7,4,3}};

        return Arrays.asList(data);
    }

    @Test
    public void testAdd() throws InterruptedException {
        float result = firstNum + secondNum;
        Assert.assertEquals(expectedResult, result, .1);
    }
}