XSLT字段验证

时间:2015-05-15 14:07:00

标签: xslt

我需要验证1..N结构内的字段内容,因此数据成对出现RESULT_ID和RESULT_VALUE。

如果“<”在Result.Min_Limit特性中找到,其值必须放在Max_Limit特征目标字段中,并且Min_Limit必须在目标结构中清除。

包含数据的源结构示例:

<?xml version="1.0" encoding="UTF-8"?>
<TEST>
    <RESULTS>
           <RESULT>
                <D_RESULT>
                 <D_RESULT_ID>Result.Derived</D_RESULT_ID>
                 <D_RESULT_VALUE>59W</D_RESULT_VALUE>
            </D_RESULT>
            <D_RESULT>
                 <D_RESULT_ID>Result.Min_Limit</D_RESULT_ID>
                 <D_RESULT_VALUE>&lt;=600.0000</D_RESULT_VALUE>
            </D_RESULT>
            <D_RESULT>
                 <D_RESULT_ID>Result.Max_Limit</D_RESULT_ID>
                 <D_RESULT_VALUE/>
            </D_RESULT>
            <D_RESULT>
                 <D_RESULT_ID>Result.FailedCriticalLvl</D_RESULT_ID>
                 <D_RESULT_VALUE>false</D_RESULT_VALUE>
            </D_RESULT>
       </RESULT>
  </RESULTS>
</TEST>

预期目标结构应如下:

<?xml version="1.0" encoding="UTF-8"?>
<TEST>
  <RESULTS>
       <RESULT>
            <D_RESULT>
                 <D_RESULT_ID>Result.Derived</D_RESULT_ID>
                 <D_RESULT_VALUE>59W</D_RESULT_VALUE>
            </D_RESULT>
            <D_RESULT>
                 <D_RESULT_ID>Result.Min_Limit</D_RESULT_ID>
                 <D_RESULT_VALUE/>
            </D_RESULT>
            <D_RESULT>
                 <D_RESULT_ID>Result.Max_Limit</D_RESULT_ID>
                 <D_RESULT_VALUE>&lt;=600.0000</D_RESULT_VALUE>
            </D_RESULT>
            <D_RESULT>
                 <D_RESULT_ID>Result.FailedCriticalLvl</D_RESULT_ID>
                 <D_RESULT_VALUE>false</D_RESULT_VALUE>
            </D_RESULT>
       </RESULT>
  </RESULTS>
</TEST>

如果它包含“&lt;”,我创建了一个存储Min_Limit值的变量字符,当指针仍处于Min_Limit特征时,它工作正常。 当它翻转到下一个特征(Max_Limit)时,变量似乎松开了它的值,因此我再也看不到Min_Limit值来将值赋给Max_Limit特征。

目前,我所拥有的内容如下:

...

    <xsl:for-each select="a:D_RESULT">
        <D_RESULT>
            <D_RESULT_ID>
                <xsl:value-of select="a:D_RESULT_ID"/>
            </D_RESULT_ID>
            <D_RESULT_VALUE>
                <xsl:value-of select="a:D_RESULT_VALUE"/>
            </D_RESULT_VALUE>
        </D_RESULT>
    </xsl:for-each>
</RESULT>

......其他领域

我在这里发现了一些有趣的对话,我认为这些方法有助于解决这个问题,但我不确定我是否理解应用于我的场景。 这是其中一个XSLT: nested for-each and dynamic variable

有人会建议解决这个问题吗?

非常感谢提前! 拉斐尔。

1 个答案:

答案 0 :(得分:1)

这是你可以看到它的一种方式:

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="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="D_RESULT_VALUE[../D_RESULT_ID='Result.Min_Limit' and contains(., '&lt;')] ">
    <xsl:copy/>
</xsl:template>

<xsl:template match="D_RESULT_VALUE[../D_RESULT_ID='Result.Max_Limit' and contains(../../D_RESULT[D_RESULT_ID='Result.Min_Limit']/D_RESULT_VALUE, '&lt;')] ">
    <xsl:copy>
        <xsl:value-of select="../../D_RESULT[D_RESULT_ID='Result.Min_Limit']/D_RESULT_VALUE"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

演示:http://xsltransform.net/3NzcBtA