使用element中指定的字符串长度来检查另一个元素

时间:2016-12-14 08:32:32

标签: xml xslt

我正在编写样式表来创建一个报告,指出文件中的文本字符串比允许的长。 (据我所知,这不可能与模式1.0有关。)

对于每个Text我正在检查Value元素中包含的字符串的长度是否超过Info元素中为该特定文本指定的长度。

但是,我发现我的maxLength变量不能用作全局变量。因此即使我能够获得有关最大长度的信息,我也无法在支票中使用这些值。 我可以就如何最好地重新设计样式表使用一些建议。

我的XSL:

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <!-- Message template -->
    <xsl:template match="Text" >
        <xsl:variable name="messageNumber" select="@Id"/>
        <xsl:variable name="maxLength"/>

        <xsl:choose>
            <xsl:when test="(normalize-space(Info)='')">
                <xsl:variable name="maxLength" select="40" />
                Message <xsl:value-of select="$messageNumber"/> is missing Max Length. Using <xsl:value-of select="$maxLength"/>
            </xsl:when>
            <xsl:when test="contains(Info,'char')">
                <xsl:variable name="maxLength1" select="substring-before(Info, 'char')"/>
                <xsl:variable name="maxLength" select="substring($maxLength1,  string-length($maxLength1) - 2)" />
            </xsl:when>
            <xsl:otherwise></xsl:otherwise>
        </xsl:choose> 

        <xsl:choose>    
            <xsl:when test="string-length(Value) &gt; $maxLength">
                Message <xsl:value-of select="$messageNumber"/> too long: <xsl:value-of select="string-length(Value)"/> chars (max is <xsl:value-of select="$maxLength"/>) 
            </xsl:when>
            <xsl:otherwise>
                Message <xsl:value-of select="$messageNumber"/> is OK: <xsl:value-of select="string-length(Value)"/> chars (max is <xsl:value-of select="$maxLength"/>) 
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>   
</xsl:stylesheet>

我的XML:

<?xml version="1.0" ?>
<Texts>
  <Text Id="1">
    <Value>OK</Value>
    <Info>Text length for button, max 6 chars</Info>
  </Text>
  <Text Id="2">
    <Value>Cancel</Value>
    <Info>Button, Maximum length 9 chars</Info>
  </Text>
  <Text Id="3">
    <Value>Continue</Value>
    <Info>This text cannot be longer than 14 characters. Use short form if required.</Info>
  </Text>
  <Text Id="4">
    <Value>Twinkle, twinkle little star</Value>
    <Info>Title text, Maximum length 14 chars.</Info>
  </Text>
  <Text Id="5">
    <Value>Twinkle, twinkle little star again</Value>
    <Info></Info>
  </Text>
</Texts>

所需的输出是这样的:

Message 1 is OK: 2 chars (max is 6)
Message 2 is OK: 6 chars (max is 9)
Message 3 is OK: 8 chars (max is 14)
Message 4 too long: 28 chars (max is 14)
Message 5 is missing Max Length. Using 40
Message 5 is OK: 34 chars (max is 40)

1 个答案:

答案 0 :(得分:0)

XSLT中的变量是不可变的,一旦设置就无法更改。您的XSLT正在做的是在maxLength语句中初始化一个名为xsl:when的新变量,该变量在该块的范围内是本地的(据说&#34; shadow&#34;主要变量)

您需要做的事情是使用单独的语句来初始化maxLength并显示消息。

试试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <!-- Message template -->
    <xsl:template match="Text" >
        <xsl:variable name="messageNumber" select="@Id"/>

        <xsl:variable name="maxLength">
            <xsl:choose>
                <xsl:when test="(normalize-space(Info)='')">40</xsl:when>
                <xsl:when test="contains(Info,'char')">
                    <xsl:variable name="maxLength1" select="substring-before(Info, 'char')"/>
                    <xsl:value-of select="substring($maxLength1,  string-length($maxLength1) - 2)" />
                </xsl:when>
            </xsl:choose> 
        </xsl:variable>

        <xsl:if test="(normalize-space(Info)='')">
            Message <xsl:value-of select="$messageNumber"/> is missing Max Length. Using <xsl:value-of select="$maxLength"/>
        </xsl:if>

        <xsl:choose>    
            <xsl:when test="string-length(Value) &gt; $maxLength">
                Message <xsl:value-of select="$messageNumber"/> too long: <xsl:value-of select="string-length(Value)"/> chars (max is <xsl:value-of select="$maxLength"/>) 
            </xsl:when>
            <xsl:otherwise>
                Message <xsl:value-of select="$messageNumber"/> is OK: <xsl:value-of select="string-length(Value)"/> chars (max is <xsl:value-of select="$maxLength"/>) 
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>   
</xsl:stylesheet>