XSLT复制除变量

时间:2015-09-13 09:36:54

标签: xml xslt

编辑:

感谢您的回复,我现在了解了一些,但似乎无法在更高级的案例中使用它,例如此输入:

      <root>
      <output>               
                        <query name="query1">
                            <parameters>
                                <parameter name="id_action">8947</parameter>
                            </parameters>
                            <queryResults/>                     
                        </query>
                        <query name="query1">
                            <parameters>
                                <parameter name="id_action">8943</parameter>
                            </parameters>
                            <queryResults>
                                <record id="1">
                                    <column name="id_action">8943</column>
                                    <column name="Actname">testing</column>
                                </record>
                            </queryResults>
                            <queryErrors/>
                        </query>
                        <query name="query1">
                            <parameters>
                                <parameter name="id_action">1571</parameter>
                            </parameters>
                            <queryResults/>                      
                        </query>                
                </output>       
                <output2>                
                        <query name="query2">
                            <parameters>
                                <parameter name="id">1</parameter>
                            </parameters>
                            <queryResults>
                                <record id="1">
                                     <column name="DepName">West</column>
                                    <column name="id_action">8947</column>
                                </record>
                                <record id="2">
                                    <column name="DepName">West</column>
                                    <column name="id_action">8943</column>
                                </record>
                                <record id="3">
                                    <column name="DepName">East</column>
                                    <column name="id_action">1571</column>
                                </record>
                            </queryResults>                      
                        </query>                    
                </output2>

<root>

我想从'query1'中获取 id_action 的值,该查询具有/ queryResults / record(在本例中为id_action = 8943)并从下面复制名为“query2”的所有查询除了列[@ name ='id_action']等于8943的那些。

期望的输出:

<root>
    <output2>
       <query name="query2">
                                <parameters>
                                    <parameter name="id">1</parameter>
                                </parameters>
                                <queryResults>
                                    <record id="1">
                                         <column name="DepName">West</column>
                                        <column name="id_action">8947</column>
                                    </record>

                                    <record id="3">
                                        <column name="DepName">East</column>
                                        <column name="id_action">1571</column>
                                    </record>
                                </queryResults>                      
                            </query>        

     </output2>
<root>

EDIT2 : 注意:query1是一个被多次调用的查询,在上面的例子中是3次,但只有1次它有值(当存在节点“record”时)。所以我想只在query1有'record'节点时才接受id_action。与此情况类似,8943是有效值。另外,请记住,在id_action中有两个或更多可能值的可能性,所以我想要每个值。

注意2:从query2开始,我想保留与上面的id_action(query1)中的值不同的记录。请注意,query2具有记录1,记录2等

基本上,对于具有queryResults / record的每个'query1',我从该queryResults / record / column [@ name ='id_action']获取值,并从“query2”中复制没有该值的每条记录query2 / queryResults / record / column中的值[@ name ='id_action']

1 个答案:

答案 0 :(得分:0)

已根据您的修改

进行了编辑
  

我想从'query1'获取id_action的值   / queryResults / record(在本例中为id_action = 8943)并复制所有   从下面查询名称为“query2”的查询除了具有的查询   列[@ name ='id_action']等于8943。

这是交叉引用的问题,因此最好在 key 的帮助下处理它:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="k" match="output/query[queryResults/record]" use="parameters/parameter[@name='id_action']" />

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

<!-- suppress the first output branch -->
<xsl:template match="output"/>

<!-- suppress records that have a matching entry in the other branch -->
<xsl:template match="record[key('k', column[@name='id_action'])]"/>

</xsl:stylesheet>