首页 文章

XSLT按子节点值选择

提问于
浏览
0

我正在尝试使用XSLT处理XML文件,我需要按子值选择节点 . 我试图通过正则表达式简单地过滤掉结果,但也许这不是最优雅的方法 . 我认为XSLT是进行此转换的通用解决方案,如果没有,请建议我一个更好的解决方案 . XML文件实际上如下所示:

<?xml version="1.0" encoding="windows-1250"?>
<SHOP>
<SHOPITEM>
<unknown_element1></unknown_element1>
<unknown_element2></unknown_element2>
...
<YEAR>2015</YEAR>
<unknown_elementxy></unknown_elementxy>
...
</SHOPITEM>
<SHOPITEM>
<unknown_element1></unknown_element1>
<unknown_element2></unknown_element2>
...
<YEAR>2014</YEAR>
<unknown_elementxy></unknown_elementxy>
...
</SHOPITEM>
<SHOPITEM>
<unknown_element1></unknown_element1>
<unknown_element2></unknown_element2>
...
<YEAR>2015</YEAR>
<unknown_elementxy></unknown_elementxy>
...
</SHOPITEM>
</SHOP>

我想保留当前的XML结构,但只保留= 2015的节点 . 所需的输出:

<?xml version="1.0" encoding="windows-1250"?>
<SHOP>
<SHOPITEM>
<unknown_element1></unknown_element1>
<unknown_element2></unknown_element2>
...
<YEAR>2015</YEAR>
<unknown_elementxy></unknown_elementxy>
...
</SHOPITEM>
<SHOPITEM>
<unknown_element1></unknown_element1>
<unknown_element2></unknown_element2>
...
<YEAR>2015</YEAR>
<unknown_elementxy></unknown_elementxy>
...
</SHOPITEM>
</SHOP>

<unknown_element> =节点中有许多不同的元素,XSLT应保持实际节点的当前结构 . 只需要通过 <YEAR> 过滤掉节点 .

我正在尝试这样的事情:

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

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

</xsl:stylesheet>

3 回答

  • 2

    这对你有用吗?

    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:template match="/SHOP">
        <xsl:copy>
            <xsl:copy-of select="SHOPITEM[YEAR=2015]"/>
        </xsl:copy>
    </xsl:template>
    
    </xsl:stylesheet>
    
  • 1

    正如Ian Roberts所说,你应该从身份变换开始,然后从那里进行定制 . 这就是你所需要的:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="no" indent="yes" method="xml"/>
    
     <xsl:template match="node() | @*">
         <xsl:copy>
           <xsl:apply-templates select="node()|@*"/>
         </xsl:copy>
     </xsl:template>
    
     <!-- Omit any shop item without YEAR = 2015 -->
     <xsl:template match="SHOPITEM[not(YEAR = 2015)]" />
    
    </xsl:stylesheet>
    

    在样本输入上运行时,结果为:

    <SHOP> 
      <SHOPITEM> 
        <unknown_element1/>  
        <unknown_element2/> ...
        <YEAR>2015</YEAR>  
        <unknown_elementxy/> ...
      </SHOPITEM>  
    
      <SHOPITEM> 
        <unknown_element1/>  
        <unknown_element2/> ...
        <YEAR>2015</YEAR>  
        <unknown_elementxy/> ...
      </SHOPITEM> 
    </SHOP>
    
  • 0

    你可以嵌套谓词 - 试试 //SHOPITEM[YEAR[text() = 2015]]

相关问题