使用xslt从特定xml元素中排除属性

时间:2010-06-25 07:54:34

标签: xml xslt

我是xslt的新手。我有以下问题。我需要在xml中删除特定元素(例如theAttribute)中的特定属性(示例中为div)。 即。

<html>
   <head>...</head>
   <body>
      <div id="qaz" theAtribute="44">
      </div>
      <div id ="ddd" theAtribute="4">
         <div id= "ggg" theAtribute="9">
         </div>
      </div>
      <font theAttribute="foo" />
   </body>
</html>

成为

<html>
   <head>...</head>
   <body>
      <div id="qaz">
      </div>
      <div id ="ddd">
         <div id= "ggg">
         </div>
      </div>
      <font theAttribute="foo" />
   </body>
</html>

删除了属性theAtribute的位置。我找到了这个, http://www.biglist.com/lists/xsl-list/archives/200404/msg00668.html基于此我试图找到合适的解决方案。

即。 <xsl:template match="@theAtribute" />

将其从整个文档中删除...和其他人喜欢匹配,如果选择等等。没有什么工作.. :-(你可以帮我解决这个问题吗?这对我来说听起来微不足道,但是对于xslt,我不能应对...

提前谢谢大家

3 个答案:

答案 0 :(得分:28)

什么不起作用?你想要相同的内容,只是没有@theAtribute吗?

如果是这样,请确保您的样式表具有@theAtribute的空模板,但也有一个标识模板可将其他所有内容复制到输出中:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!--empty template suppresses this attribute-->
    <xsl:template match="@theAtribute" />
    <!--identity template copies everything forward by default-->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

如果您只想取消某些@theAtribute,则可以使匹配条件更具体。例如,如果您只想从div @id="qaz" <xsl:template match="@theAtribute[../@id='qaz']" /> 删除该属性,那么您可以使用此模板:

<xsl:template match="*[@id='qaz']/@theAtribute" />

或此模板:

@theAttribute

如果要从所有div元素中删除<xsl:template match="div/@theAtribute" /> ,请将匹配表达式更改为:

{{1}}

答案 1 :(得分:10)

在select中,您可以使用名称函数排除(或包含)属性。

例如,<xsl:copy-of select="@*[name(.)!='theAtribute']|node()" />

答案 2 :(得分:0)

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

        <xsl:output method="xml" encoding="UTF-8" indent="yes" />
        <xsl:param name="status"/>

        <!--If attribute is present change it -->
        <xsl:template match="@status" >
            <xsl:attribute name="status" select="$status"/>
        </xsl:template>
        <!-- If attribute is not present add it al last position -->
        <xsl:template match="row[ not( @status ) ]" >
            <xsl:copy>
                <xsl:apply-templates select="@*"/>
                <!-- put attribute in the last position -->
                <xsl:attribute name="status" select="$status"/>
                <xsl:apply-templates select="node()"/>
            </xsl:copy>
        </xsl:template>

        <!--identity template copies everything forward by default-->
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>

    </xsl:stylesheet>

我有一个类似xml的

<row  attribute1="value" >some stuff</row> 

并且我要在属性列表的末尾添加外部值的状态。

\ saxonee \ bin \ Transform.exe -xsl:my_script.xsl -s:rows.xml status =“已完成”

<row current_run="2019-07-29 19:00" status="completed">