从RESULTING xslt转换中删除空节点

时间:2015-07-13 10:58:49

标签: xslt-2.0

我有以下要求,如果它是href属性,我需要排除<xlink:link>,如果它的值以“.xml”结尾,我需要排除<loc>。 “.xslt”| “的.properties”。这有时让我有以下几点。 <div ...></div>有没有办法一次删除这些<div ...></div>,还是需要连续处理?

我输入的片段:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1" xmlns:xhtml="http://www.w3.org/1999/xhtml">
    <url>
        <loc id="843">en-us/system/xml/navigation.xml</loc>
        <xhtml:link href="/fr-fr/system/xml/navigation.xml" hreflang="fr-fr" rel="alternate"/>
        <xhtml:link href="/en-uk/system/xml/navigation.xml" hreflang="en-uk" rel="alternate"/>
    </url>
    <url>
        <loc id="3159">/en-us/index.html</loc>
        <xhtml:link href="/fr-lu/index.html" hreflang="fr-lu" rel="alternate"/>
    </url>
</urlset>

我的xslt:

<xsl:stylesheet version="2.0" xpath-default-namespace="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1" xmlns:xhtml="http://www.w3.org/1999/xhtml" exclude-result-prefixes="video image xsl xhtml">
<xsl:output method="xhtml" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>

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

<!-- transform urlset -->
<xsl:template match="urlset">
    <div class="urlset"><xsl:apply-templates select="@*|node()" /></div>
</xsl:template>

<!-- transform url -->
<xsl:template match="url">
    <div class="url"><xsl:apply-templates select="@*|node()" /></div>
</xsl:template>  

<!-- transform the 'link' when valid -->
<xsl:template match="xhtml:link">
    <a><xsl:apply-templates select="@*|node()" /></a>
</xsl:template> 

<!-- transform the 'loc' when valid -->
<xsl:template match="loc">
    <a>
        <xsl:attribute name="href">
            <xsl:value-of select="." />
        </xsl:attribute>
        <xsl:apply-templates select="@*" />
    </a>
</xsl:template>


<!-- transform the 'link' when not valid -->
<xsl:template match="xhtml:link[@href[ends-with(.,'.xml') or ends-with(.,'.xslt') or ends-with(.,'.properties')]]" /> 

<!-- transform the 'loc' when not valid -->
<xsl:template match="loc[ends-with(.,'.xml') or ends-with(.,'.xslt') or ends-with(.,'.properties')]" />

</xsl:stylesheet>

结果:

<div class="urlset">
   <div class="url"></div>  <=== *** I need to get rid of the likes of this ***
   <div class="url">
      <a href="/en-us/index.html" id="3159"></a>
      <a href="/fr-lu/index.html" hreflang="fr-lu" rel="alternate"></a>
   </div>

我已经做了一些搜索类似的问题,但他们都在解决从原始文档中删除空节点的问题,而不是结果。

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

如果你添加

<xsl:template match="url[every $node in (loc, xhtml:link/@href) satisfies (ends-with($node,'.xml') or ends-with($node,'.xslt') or ends-with($node,'.properties'))]"/>

那些只有urlloc以及要删除的结尾的xhtml:link/@href元素将不会被转换,也不会创建输出。因此,通过这样的方法,您可以一步完成,我不知道foo中是否存在其他内容,例如url元素,这些元素也需要转换元素,但是总能编写更复杂的条件来涵盖这一点。