XSLT 忽略变量选择和条件并执行一切

XSLT Ignoring variable selection and conditioning and execuing everything

在我的代码中,我遇到了当前的问题。我正在尝试 return 来自“配置”元素的属性“版本”的值,并使用它来制定条件。

如果版本=“2”,它应该执行模板“c-stage”,如果它以“$”开头,那么它应该删除美元符号,将它保存到变量中,将它与变量进行比较在XML文件夹中,如果比较时的变量等于“2”,则运行模板为“c-stage”。如果元素“config”没有“version”属性,它会在节点层次结构中查找 parents“version”。

目前这是我的代码:

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

   <xsl:template match="@*|node()">
       <xsl:copy>
           <xsl:apply-templates select="@*|node()" mode="c-check" />
       </xsl:copy>
   </xsl:template>

   <!-- c-condition -->

   <xsl:template match="//config" mode="c-check">
       <xsl:variable name="versionspec">
           <xsl:apply-templates select="." mode="c-condition" />
       </xsl:variable>
       <xsl:variable name="staged">
           <xsl:choose>
               <xsl:when test="starts-with($versionspec, '2.')">
                   <xsl:value-of select="$versionspec" />
               </xsl:when>
               <xsl:otherwise />
           </xsl:choose>
       </xsl:variable>
       <xsl:choose>
           <xsl:when test="$staged">
               <xsl:copy>
                   <xsl:apply-templates select="." mode="c-staged" />
               </xsl:copy>
           </xsl:when>
           <xsl:otherwise>
               <xsl:copy>
                   <xsl:apply-templates select="." mode="c-non-staged" />
               </xsl:copy>
           </xsl:otherwise>
       </xsl:choose>
   </xsl:template>

   <xsl:template match="config" mode="c-condition">
       <xsl:message>
           Foo!
           <xsl:value-of select="@name" />
       </xsl:message>
       <xsl:choose>
           <xsl:when test="@version">
               <xsl:choose>
                   <xsl:when test="starts-with(translate(@version, '0123456789', '9999999999'), '9')">
                       <xsl:value-of select="." />
                   </xsl:when>
                   <xsl:when test="starts-with(@version, '$')">
                       <xsl:variable name="variableName">
                           <xsl:call-template name="remove">
                               <xsl:with-param name="value" select="." />
                           </xsl:call-template>
                       </xsl:variable>
                       <!-- strip the dollar sign an braces and assign the result to a variable "variableName" -->
                       <xsl:apply-templates select="//variable[@name = $variableName]" mode="c-condition" />
                   </xsl:when>
                   <xsl:otherwise />
               </xsl:choose>
               <!-- find versionSpec -->
           </xsl:when>
           <xsl:otherwise>
               <xsl:if test="@extension">
                   <xsl:variable name="extension" select="@extension" />
                   <xsl:apply-templates select="//config[@name=$extension]" mode="c-condition" />
               </xsl:if>
           </xsl:otherwise>
       </xsl:choose>
   </xsl:template>


   <xsl:template match="config" mode="c-staged">
       <!-- CHECKS CURRENT STAGE -->
       <xsl:choose>
           <xsl:when test="contains(@name, 'release')">
               <xsl:copy>
                   <xsl:copy-of select="@*" />
                   <xsl:attribute name="stage">RELEASE</xsl:attribute>
                   <xsl:copy-of select="*" />
               </xsl:copy>
           </xsl:when>
           <xsl:when test="contains(@name, 'test')">
               <xsl:copy>
                   <xsl:copy-of select="@*" />
                   <xsl:attribute name="stage">TEST</xsl:attribute>
                   <xsl:copy-of select="*" />
               </xsl:copy>
           </xsl:when>
           <xsl:otherwise>
               <xsl:copy>
                   <xsl:copy-of select="@*|*" />
               </xsl:copy>
           </xsl:otherwise>
       </xsl:choose>
   </xsl:template>


   <xsl:template match="config" mode="c-non-staged">
       <xsl:copy>
           <xsl:copy-of select="@*|*" />
       </xsl:copy>
   </xsl:template>

   <xsl:template match="variable" mode="c-condition">
       <xsl:value-of select="text()" />
   </xsl:template>

   <xsl:template name="remove">
       <xsl:param name="value" />
       <xsl:value-of select="concat(substring-before($value, '$['), substring-after($value, ']'))" />
   </xsl:template>

</xsl:stylesheet> 

这是我的 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>

<?xml-stylesheet type="text/xsl" href="Launcher.xsl"?>

<launcherConfig>
    <variables>
        <variable name="productionVersion">1.23</variable>
        <variable name="productionPriority">0</variable>
        
        <variable name="releaseSITEVersion">1.1.214c</variable> 
        <variable name="testSITEVersion">1.1</variable> 
        
        <variable name="testSITEVersion4294_RC1">1.4.254</variable> 
        <variable name="testSITEVersion4607">-1.1</variable> 
        <variable name="testSITEVersion5210">1.6</variable> 
        <variable name="testSITEVersion5227_Fix">1.7.2702</variable>
        <variable name="testSITEVersion5344">true</variable>
        <variable name="testSITEVersion5682">1.3.3418</variable>
        <variable name="testSITEVersionALTRAP5693">1.8</variable>

        
        <variable name="testSITEVersion4856">foo.1.2146</variable>
        <variable name="testSITEVersion5227">1.1.2530</variable>
    </variables>
    <configs>
        
        <config name="1_TEST_FOO" extends="1" abstract="true" version="1">
        </config>
        <config name="1_TEST_FOO_release" extends="1_TEST_FOO">     
        </config>
        <config name="1_TEST_FOO_test" extends="1_TEST_FOO" version="${testSITEVersion5227}">   
        </config>
        
        <config name="2_TEST_FOO" extends="2" abstract="true">
        </config>
        <config name="2_TEST_FOO_release" extends="2_TEST_FOO" version="2.0" >          
        </config>
        <config name="2_TEST_FOO_test" extends="2_TEST_FOO" version="${testSITEVersion5227}">           
        </config>
        
        <config name="3_TEST_FOO" extends="3" abstract="true" version="${releaseSITEVersion}">
        </config>
        <config name="3_TEST_FOO_release" extends="3_TEST_FOO" >
        </config>
        <config name="3_TEST_FOO_test" extends="3_TEST_FOO">            
        </config> 
   </configs>
</launcherConfig>

从我的角度来看,我的代码应该可以正常工作,但是(我对 XSL 很陌生)它目前忽略了所有条件,只是直接执行“c-stage”,甚至忽略了版本。 送我这个:

<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="Launcher.xsl"?><launcherConfig>
        
        1.23
        0
        
        1.1.214c 
        1.1 
        
        1.4.254 
        -1.1 
        1.6 
        1.7.2702
        true
        1.3.3418
        1.8

        
        foo.1.2146
        1.1.2530
    

    
        
        
    <config>
        <config name="1_TEST_FOO" extends="1" abstract="true" version="1"/>
    </config>
            
    <config>
        <config name="1_TEST_FOO_release" extends="1_TEST_FOO" stage="RELEASE"/>
    </config>
            
    <config>
        <config name="1_TEST_FOO_test" extends="1_TEST_FOO" version="${testSITEVersion5227}" stage="TEST"/>
    </config>
            
        
    <config>
        <config name="2_TEST_FOO" extends="2" abstract="true"/>
    </config>
            
    <config>
        <config name="2_TEST_FOO_release" extends="2_TEST_FOO" version="2.0" stage="RELEASE"/>
    </config>
            
    <config>
        <config name="2_TEST_FOO_test" extends="2_TEST_FOO" version="${testSITEVersion5227}" stage="TEST"/>
    </config>
            
        
    <config>
        <config name="3_TEST_FOO" extends="3" abstract="true" version="${releaseSITEVersion}" stage="TEST"/>
    </config>
            
    <config>
        <config name="3_TEST_FOO_release" extends="3_TEST_FOO" stage="RELEASE"/>
    </config>
            
    <config>
        <config name="3_TEST_FOO_test" extends="3_TEST_FOO" stage="TEST"/>
    </config>
        

</launcherConfig>

它只是在没有遵循适当条件的情况下为它们中的每一个添加属性“stage”。

我想知道我做错了什么,我该如何解决?

也许标题不是最好的,这里是 Whosebug 和 XSLT noobie

我没有仔细看逻辑,但是:

   <xsl:variable name="staged">
       <xsl:choose>
           <xsl:when test="starts-with($versionspec, '2.')">
               <xsl:value-of select="$versionspec" />
           </xsl:when>
           <xsl:otherwise />
       </xsl:choose>
   </xsl:variable>

xsl:variable 上没有“as”属性的情况下,变量是文档节点,因此 <xsl:when test="$staged"> 始终为真。

我不确定您希望 $staged 是什么类型,但是为了可读性、可调试性、性能和可靠性,最好在 @as 属性中声明它。