Xslt 使用的xsl:copy时抑制默认属性

Xslt 使用的xsl:copy时抑制默认属性,xslt,xslt-2.0,Xslt,Xslt 2.0,在使用xsl:copy of时,我不知道如何抑制xhtml输出文档中的默认属性shape=“rect” 示例XML: <div class="table"> <p class="table-caption"><span class="table-label">Table 7.2</span> Foo<a class="tabfn-ref" href="#s9781483390086.i825" id="s97814833900

在使用
xsl:copy of
时,我不知道如何抑制xhtml输出文档中的默认属性
shape=“rect”

示例XML:

<div class="table">
<p class="table-caption"><span class="table-label">Table 7.2</span> Foo<a class="tabfn-ref"
        href="#s9781483390086.i825" id="s9781483390086.i808" shape="rect"><sup>a</sup></a> in
    Pricing</p>
<img alt="Table 11" class="table-image" src="10.4135_9781483390086-table11.jpg"/>
<table>
    <tgroup cols="3">
        <colspec align="left" colname="1" colnum="1"/>
        <colspec align="left" colname="2" colnum="2"/>
        <colspec align="left" colname="3" colnum="3"/>
        <thead>
            <row rowsep="1">
                <entry align="left">
                    <p/>
                </entry>
                <entry align="left">
                    <p>N</p>
                </entry>
                <entry align="left">
                    <p>%</p>
                </entry>
            </row>
        </thead>
        <tbody>
            <row>
                <entry>
                    <p>Foo<a class="tabfn-ref" href="#s9781483390086.i826"
                            id="s9781483390086.i809" shape="rect"><sup>b</sup></a></p>
                    <p>1–12</p>
                    <p>13–24</p>
                    <p>25–36</p>
                    <p>37–48</p>
                    <p>49–60</p>
                    <p>61–72</p>
                    <p>73–84</p>
                    <p>85–96</p>
                    <p>More than 96</p>
                </entry>
            </row>
            <row>
                <entry>
                    <p>Bar<a class="tabfn-ref" href="#s9781483390086.i827"
                            id="s9781483390086.i810" shape="rect"><sup>c</sup></a></p>
                    <p>1–20%</p>
                    <p>21–40%</p>
                    <p>41–60%</p>
                    <p>61–80%</p>
                    <p>More than 80%</p>
                </entry>
            </row>
        </tbody>
    </tgroup>
</table>
<div class="table-notes" id="s9781483390086.i825a">
    <p class="table-note" id="s9781483390086.i825b"><span class="label-fn"><a class="tabfn-ref"
                href="#s9781483390086.i808" id="s9781483390086.i825" shape="rect"
                ><sup>a</sup></a></span> Foo</p>
    <p class="table-note" id="s9781483390086.i825c"><span class="label-fn"><a class="tabfn-ref"
                href="#s9781483390086.i809" id="s9781483390086.i826" shape="rect"
                ><sup>b</sup></a></span> Bar</p>
    <p class="table-note" id="s9781483390086.i825d"><span class="label-fn"><a class="tabfn-ref"
                href="#s9781483390086.i810" id="s9781483390086.i827" shape="rect"
                ><sup>c</sup></a></span> Too</p>
</div>
这显然是行不通的

输出:

    <div class="table">
   <img alt="Table 11" class="table-image" src="10.4135_9781483390086-table11.jpg"/>
   <table xmlns="http://www.w3.org/1999/xhtml" hidden="hidden">
      <caption>
         <p xmlns="" class="table-caption">
            <span class="table-label">Table 7.2</span> Foo <a class="tabfn-ref"
               href="#s9781483390086.i825" id="s9781483390086.i808" shape="rect">
               <sup>a</sup>
            </a> in Pricing </p>
      </caption>
      <tgroup xmlns="" cols="3">
         <colspec align="left" colname="1" colnum="1"/>
         <colspec align="left" colname="2" colnum="2"/>
         <colspec align="left" colname="3" colnum="3"/>
         <thead>
            <row rowsep="1">
               <entry align="left">
                  <p/>
               </entry>
               <entry align="left">
                  <p>N</p>
               </entry>
               <entry align="left">
                  <p>%</p>
               </entry>
            </row>
         </thead>
         <tbody>
            <row>
               <entry>
                  <p>Foo <a class="tabfn-ref" href="#s9781483390086.i826" id="s9781483390086.i809">
                        <sup>b</sup>
                     </a>
                  </p>
                  <p>1–12</p>
                  <p>13–24</p>
                  <p>25–36</p>
                  <p>37–48</p>
                  <p>49–60</p>
                  <p>61–72</p>
                  <p>73–84</p>
                  <p>85–96</p>
                  <p>More than 96</p>
               </entry>
            </row>
            <row>
               <entry>
                  <p>Bar <a class="tabfn-ref" href="#s9781483390086.i827" id="s9781483390086.i810">
                        <sup>c</sup>
                     </a>
                  </p>
                  <p>1–20%</p>
                  <p>21–40%</p>
                  <p>41–60%</p>
                  <p>61–80%</p>
                  <p>More than 80%</p>
               </entry>
            </row>
         </tbody>
      </tgroup>
   </table>
   <div class="table-notes" id="s9781483390086.i825a">
      <p class="table-note" id="s9781483390086.i825b">
         <span class="label-fn">
            <a class="tabfn-ref" href="#s9781483390086.i808" id="s9781483390086.i825">
               <sup>a</sup>
            </a>
         </span> Foo </p>
      <p class="table-note" id="s9781483390086.i825c">
         <span class="label-fn">
            <a class="tabfn-ref" href="#s9781483390086.i809" id="s9781483390086.i826">
               <sup>b</sup>
            </a>
         </span> Bar </p>
      <p class="table-note" id="s9781483390086.i825d">
         <span class="label-fn">
            <a class="tabfn-ref" href="#s9781483390086.i810" id="s9781483390086.i827">
               <sup>c</sup>
            </a>
         </span> Too </p>
   </div>
</div>

表7.2定价中的Foo

N

%

1-12

13-24

25-36

37-48

49-60

61-72

73-84

85-96

超过96

酒吧

1-20%

21-40%

41-60%

61-80%

超过80%

酒吧


在第一个a class=“tabfn ref”中,形状属性被保留(由于复制了)。我需要抑制此操作。

在使用
xsl:copy of
时,您无法排除属性或节点。它执行所选节点的深度复制

由于您已经使用带有空模板的标识转换来抑制
@shape
属性,并且已经有一个与
//div[@class='table']//p[@class='table-caption']
匹配的空模板,最简单的方法是使用模式将
更改为
,并在该模式下定义模板以复制和应用模板

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:xhtml="http://www.w3.org/1999/xhtml"
    exclude-result-prefixes="xs xhtml" xmlns="http://www.w3.org/1999/xhtml"
    version="2.0">

    <xsl:output method="xhtml" indent="yes"/>

    <!-- Suppress default shape attribute -->
    <xsl:template match="*/@shape"/>

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

    <xsl:template priority="1" 
                  match="//div[@class='table']//p[@class='table-caption']"/>

    <xsl:template match="//div[@class='table']//p[@class='table-caption']"
                  mode="caption">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="table">
        <table hidden="hidden">
            <caption>
                <xsl:apply-templates 
                               select="preceding-sibling::p[@class='table-caption'] 
                                     | *[not(preceding::a/@shape)]" mode="caption"/>
            </caption>
            <xsl:apply-templates/>
        </table>
    </xsl:template>

</xsl:stylesheet>

请发布有效代码(最好最小化到只需要必要的代码),这样我们就可以重现问题。一般来说,做深度复制-你不能挑拣拣。谢谢你,Mads,这正是我需要的。在这里,我很难找到使用apply模板的解决方案,因为我需要在XML中抑制表标题的输出。使用模式非常有效。再次感谢。
    <div class="table">
   <img alt="Table 11" class="table-image" src="10.4135_9781483390086-table11.jpg"/>
   <table xmlns="http://www.w3.org/1999/xhtml" hidden="hidden">
      <caption>
         <p xmlns="" class="table-caption">
            <span class="table-label">Table 7.2</span> Foo <a class="tabfn-ref"
               href="#s9781483390086.i825" id="s9781483390086.i808" shape="rect">
               <sup>a</sup>
            </a> in Pricing </p>
      </caption>
      <tgroup xmlns="" cols="3">
         <colspec align="left" colname="1" colnum="1"/>
         <colspec align="left" colname="2" colnum="2"/>
         <colspec align="left" colname="3" colnum="3"/>
         <thead>
            <row rowsep="1">
               <entry align="left">
                  <p/>
               </entry>
               <entry align="left">
                  <p>N</p>
               </entry>
               <entry align="left">
                  <p>%</p>
               </entry>
            </row>
         </thead>
         <tbody>
            <row>
               <entry>
                  <p>Foo <a class="tabfn-ref" href="#s9781483390086.i826" id="s9781483390086.i809">
                        <sup>b</sup>
                     </a>
                  </p>
                  <p>1–12</p>
                  <p>13–24</p>
                  <p>25–36</p>
                  <p>37–48</p>
                  <p>49–60</p>
                  <p>61–72</p>
                  <p>73–84</p>
                  <p>85–96</p>
                  <p>More than 96</p>
               </entry>
            </row>
            <row>
               <entry>
                  <p>Bar <a class="tabfn-ref" href="#s9781483390086.i827" id="s9781483390086.i810">
                        <sup>c</sup>
                     </a>
                  </p>
                  <p>1–20%</p>
                  <p>21–40%</p>
                  <p>41–60%</p>
                  <p>61–80%</p>
                  <p>More than 80%</p>
               </entry>
            </row>
         </tbody>
      </tgroup>
   </table>
   <div class="table-notes" id="s9781483390086.i825a">
      <p class="table-note" id="s9781483390086.i825b">
         <span class="label-fn">
            <a class="tabfn-ref" href="#s9781483390086.i808" id="s9781483390086.i825">
               <sup>a</sup>
            </a>
         </span> Foo </p>
      <p class="table-note" id="s9781483390086.i825c">
         <span class="label-fn">
            <a class="tabfn-ref" href="#s9781483390086.i809" id="s9781483390086.i826">
               <sup>b</sup>
            </a>
         </span> Bar </p>
      <p class="table-note" id="s9781483390086.i825d">
         <span class="label-fn">
            <a class="tabfn-ref" href="#s9781483390086.i810" id="s9781483390086.i827">
               <sup>c</sup>
            </a>
         </span> Too </p>
   </div>
</div>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:xhtml="http://www.w3.org/1999/xhtml"
    exclude-result-prefixes="xs xhtml" xmlns="http://www.w3.org/1999/xhtml"
    version="2.0">

    <xsl:output method="xhtml" indent="yes"/>

    <!-- Suppress default shape attribute -->
    <xsl:template match="*/@shape"/>

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

    <xsl:template priority="1" 
                  match="//div[@class='table']//p[@class='table-caption']"/>

    <xsl:template match="//div[@class='table']//p[@class='table-caption']"
                  mode="caption">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="table">
        <table hidden="hidden">
            <caption>
                <xsl:apply-templates 
                               select="preceding-sibling::p[@class='table-caption'] 
                                     | *[not(preceding::a/@shape)]" mode="caption"/>
            </caption>
            <xsl:apply-templates/>
        </table>
    </xsl:template>

</xsl:stylesheet>