2016-11-04 140 views
0

我很新的XSLT和我想排序XML文件的一部分(保持所有文件数据)XSLT分拣文件的某些部分

这里的文件:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="test.xsd"> 

    <SchemaVersion>1.0</SchemaVersion> 

    <Header>### uVision Project, (C) Keil Software</Header> 

    <Extensions> 
    <cExt>*.c</cExt> 
    <aExt>*.s*; *.src; *.a*</aExt> 
    <oExt>*.obj</oExt> 
    <lExt>*.lib</lExt> 
    <tExt>*.txt; *.h; *.inc</tExt> 
    <pExt>*.plm</pExt> 
    <CppX>*.cpp</CppX> 
    <nMigrate>0</nMigrate> 
    </Extensions> 

    <DateTime> 
    <dwLowDateTime>0</dwLowDateTime> 
    <dwHighDateTime>0</dwHighDateTime> 
    </DateTime> 

    <Target> 
    <TargetName>LYNX_XERIUS_APRR_CPU2006_0091</TargetName> 
    <ToolsetNumber>0x4</ToolsetNumber> 
    <TargetOption> 
     <OPTTT> 
     <gFlags>0</gFlags> 
     </OPTTT> 
     <AAA> 
     <SetRegEntry> 
      <Number>0</Number> 
     </SetRegEntry> 
     </AAA> 
     <Breakpoint> 
     <Bp> 
      <Number>0</Number> 
     </Bp> 
     <Bp> 
      <Number>1</Number> 
     </Bp> 
     <Bp> 
      <Number>2</Number> 
     </Bp> 
     <Bp> 
      <Number>3</Number> 
     </Bp> 
     <Bp> 
      <Number>4</Number> 
     </Bp> 
     </Breakpoint> 
     <Tracepoint> 
     <THDelay>0</THDelay> 
     </Tracepoint> 
     <DebugFlag> 
     <trace>0</trace> 
     </DebugFlag> 
     <LintExecutable></LintExecutable> 
    </TargetOption> 
    </Target> 


    <Target> 
    <TargetName>Debug</TargetName> 
    <ToolsetNumber>0x4</ToolsetNumber> 
    <TargetOption> 
     <OPTTT> 
     <gFlags>0</gFlags> 
     </OPTTT> 
     <AAA> 
     <SetRegEntry> 
      <Number>0</Number> 
     </SetRegEntry> 
     </AAA> 
     <Breakpoint> 
     <Bp> 
      <Number>0</Number> 
     </Bp> 
     <Bp> 
      <Number>1</Number> 
     </Bp> 
     <Bp> 
      <Number>2</Number> 
     </Bp> 
     <Bp> 
      <Number>3</Number> 
     </Bp> 
     <Bp> 
      <Number>4</Number> 
     </Bp> 
     </Breakpoint> 
     <Tracepoint> 
     <THDelay>0</THDelay> 
     </Tracepoint> 
     <DebugFlag> 
     <trace>0</trace> 
     </DebugFlag> 
     <LintExecutable></LintExecutable> 
    </TargetOption> 
    </Target> 


    <Target> 
    <TargetName>LYNX_HERMES_APRR_SERIE_200</TargetName> 
    <ToolsetNumber>0x4</ToolsetNumber> 
    <TargetOption> 
     <OPTTT> 
     <gFlags>0</gFlags> 
     </OPTTT> 
     <AAA> 
     <SetRegEntry> 
      <Number>0</Number> 
     </SetRegEntry> 
     </AAA> 
     <Breakpoint> 
     <Bp> 
      <Number>0</Number> 
     </Bp> 
     <Bp> 
      <Number>1</Number> 
     </Bp> 
     <Bp> 
      <Number>2</Number> 
     </Bp> 
     <Bp> 
      <Number>3</Number> 
     </Bp> 
     <Bp> 
      <Number>4</Number> 
     </Bp> 
     </Breakpoint> 
     <Tracepoint> 
     <THDelay>0</THDelay> 
     </Tracepoint> 
     <DebugFlag> 
     <trace>0</trace> 
     </DebugFlag> 
     <LintExecutable></LintExecutable> 
    </TargetOption> 
    </Target> 
    <Group> 
    <GroupName>::CMSIS</GroupName> 
    <tvExp>0</tvExp> 
    <tvExpOptDlg>0</tvExpOptDlg> 
    <cbSel>0</cbSel> 
    <RteFlg>1</RteFlg> 
    </Group> 

</Project> 

这里是我的XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:ns="urn:TestNamespace"    > 
    <xsl:output indent="yes" /> 

    <xsl:strip-space elements="*"/> 

    <xsl:template match="text()[not(string-length(normalize-space()))]"/> 

    <xsl:template match="Project"> 
    <xsl:copy>  
     <xsl:apply-templates select="Target">  
     <xsl:sort select="TargetName"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 

    <!-- global template to copy everything that doesn't match the other templates --> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

我通过排序的TargetName一个XML文件作为输出,但只有目标节点 ....

如何设置选择案例以保留未过滤的节点?

我也测试:

<xsl:copy> 
    <xsl:apply-templates select="@*"/> 
    <xsl:apply-templates select="Target">  
    <xsl:sort select="TargetName"/> 
    </xsl:apply-templates> 
</xsl:copy> 

在这种情况下,所有的数据将保留,但有没有排序

我会欣赏一些解释来提高我的知识。

问候

+0

您还没有提到样式表可能需要处理的输入文件范围。项目元素可能还有其他孩子吗?所有的目标儿童都会相邻吗?如果他们不相邻会发生什么? –

+0

您还没有说过是否使用XSLT 1.0或2.0。由于2.0解决方案通常容易得多,但许多人仍在使用1.0,因此了解这一点很重要。 –

+0

事实上,我发现其中的大多数例子是1.0 ..... 我放在网站上的数据样本不正确。 全部节点的子集。 – Harvey

回答

0

一种方法是:

<xsl:template match="Project"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()"> 
      <xsl:sort select="TargetName" />     
     </xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 

为什么是您的解决方案不工作:

<xsl:apply-templates select="Target">

您只选择Target以进一步应用。在假设排序比目标元素以外的元素的组没有任何伤害

<xsl:template match="Project"> 
    <xsl:copy> 
     <xsl:for-each-group select="*" group-adjacent="node-name()"> 
     <xsl:apply-templates> 
      <xsl:sort select="TargetName"/>    
     </xsl:apply-templates> 
     </xsl:for-each-group> 
    </xsl:copy> 
</xsl:template> 

+0

你好uL1,用这个没有排序.. – Harvey

+0

请看看:http://xsltransform.net/pPJ8LVm;元素'target'由子'TargetName' asc排序。顺序为:“调试”,“LYNX_HERMES_APRR_SERIE_200”,“LYNX_XERIUS_APRR_CPU2006_0091”。 – uL1

+0

你好,对不起,这个数据有效。 事实上,我测试的是完整的文件,它是更大的,哪个不起作用。 现在我必须明白为什么这种方式适用于较少的线路...... 谢谢。 – Harvey

0

我可能会做这(使用XSLT 2.0)。但是,在xsl:for-each-group内部有条件(xsl:choose)可能会更干净,因此排序只能在test="self::Target"时完成。

+0

我有错误:'xsl:for-each-group'coul不是'xsl:copy'的子项。与V1.0 – Harvey

+0

与V2.0。 'for-each-group'不是公认的扩展元素。 – Harvey

+0

正如我明确指出的那样,您需要一个XSLT 2.0处理器来运行它。 (在你的样式表中说version =“2.0”并不会将你古老的XSLT 1.0处理器神奇地转换成一个闪亮的新XSLT 2.0处理器)。 –