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
属性中声明它。
在我的代码中,我遇到了当前的问题。我正在尝试 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
属性中声明它。