选择包含额外属性的特定元素

时间:2018-10-18 20:17:25

标签: xml xslt xpath

我对XSLT还是很陌生,想知道如何替换某些元素。基本上,我想用普通的 BR 替换带有额外属性的 BR 元素。 XML如下:

<outer_element>
    <p>
        <font face="Arial">
            Invitations<br>
        </font>
        <font face="Arial">
            Charts<br>
        </font>
    </p>
    <span style="font-size:12pt;">
        <br clear="all" style="font-size:18pt;">
    </span>
<outer_element>

以下是XSL的一部分:

<xsl:template match="//outer_element">
    <xsl:element name="outer_element">
        <xsl:value-of select="."/>
    </xsl:element>
    <xsl:element name = "text">
        <xsl:value-of select="."/>
    </xsl:element>
</xsl:template>

此外,我不确定我正在寻找的是XSLT 1.0还是XSLT 2.0解决方案。

2 个答案:

答案 0 :(得分:1)

您可以使用以下简单模板:

<xsl:template match="br">
  <br/>
</xsl:template>

完整的模板:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="br">
    <br/>
  </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:1)

您输入的内容不是有效的XML / XHTML。 br应该关闭:<br/>。同样,最后的结束标签也不是结束标签。 如果您不希望使用有效的XHTML,请查看https://jsoup.org/http://www.html-tidy.org/

这不成问题:有一个名为identity transform的XSLT模式,该模式将输入递归地复制到输出中,但是允许您覆盖所需每个元素的复制过程。

基本模式锁定是这样的。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

现在为br添加一个模板,该模板仅复制元素,而不复制属性:

<xsl:template match="br">
 <xsl:copy/>
</xsl:template>

应该的。