2017-08-28 77 views
0

我们的旧代码使用v1.0 xsl。XSLT模板条件

<?xml version="1.0"?> 
    <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

到:

<?xml version="1.0"?> 
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

我想检查是否有非法字符都存在使用XSL字符串中的我刚刚从改变它。

这是我的代码是如何做它现在:

. . . 

<xsl:template match="GEN_Limit"> 
    <xsl:if test="string-length(.) &gt; 4">Limit ('<xsl:value-of select="string(.)"/>') - may have up to 4 characters<br/> </xsl:if> 
    <xsl:if test="string-length(.) = 0">Limit is mandatory<br/></xsl:if> 
    <xsl:if test="contains((.),'!') or contains((.),'@') or contains((.),'#') or contains((.),'$') or contains((.),'%') or contains((.),'^') or contains((.),'&amp;') or contains((.),'*') or contains((.),'(') or contains((.),')') or contains((.),'+') or contains((.),'=') or contains((.),'{') or contains((.),'}') or contains((.),'[') or contains((.),']') or contains((.),'|') or contains((.),'\') or contains((.),':') or contains((.),';') or contains((.),'&lt;') or contains((.),'&gt;') or contains((.),'?') or contains((.),'/') or contains((.),',') or contains((.),'.')">Data entered - Limit('<xsl:value-of select="string(.)"/>') may not have special characters <br/> 
    </xsl:if> 
</xsl:template> 

<xsl:template match="GEN_AcctStationNumber"> 
    <xsl:if test="string-length(.) &gt; 6">Accounting Station Number('<xsl:value-of select="string(.)"/>') - may have up to 6 characters 
     <br/> </xsl:if> 
    <xsl:if test="string-length(.) = 0">Accounting Station Number is mandatory<br/></xsl:if> 
    <xsl:if test="string(/Funding/FundsAgency) ='GEN' and not(string(/Funding/FundsFormCode) ='PP')"> 
     <xsl:if test="string(number(string(.))) ='NaN'">Accounting Station Number must be numeric <br/> </xsl:if> 
    </xsl:if> 
    <xsl:if test="contains((.),'!') or contains((.),'@') or contains((.),'#') or contains((.),'$') or contains((.),'%') or contains((.),'^') or contains((.),'&amp;') or contains((.),'*') or contains((.),'(') or contains((.),')') or contains((.),'+') or contains((.),'=') or contains((.),'{') or contains((.),'}') or contains((.),'[') or contains((.),']') or contains((.),'|') or contains((.),'\') or contains((.),':') or contains((.),';') or contains((.),'&lt;') or contains((.),'&gt;') or contains((.),'?') or contains((.),'/') or contains((.),',') or contains((.),'.')">Data entered - Accounting Station Number('<xsl:value-of select="string(.)"/>') may not have special characters <br/> 
    </xsl:if> 
</xsl:template> 

<xsl:template match="GEN_SupAcctClassification"> 
    <xsl:if test="string-length(.) &gt; 6">Supplemental Accounting Classification('<xsl:value-of select="string(.)"/>') - may have up to 6 characters 
     <br/> </xsl:if> 
    <xsl:if test="string-length(.) = 0">Supplemental Accounting Classification is mandatory<br/></xsl:if> 
    <xsl:if test="string(/Funding/FundsAgency) ='GEN' and not(string(/Funding/FundsFormCode) ='PP')"> 
     <xsl:if test="string(number(string(.))) ='NaN'">Supplemental Accounting Classification must be numeric <br/> </xsl:if> 
    </xsl:if> 
    <xsl:if test="contains((.),'!') or contains((.),'@') or contains((.),'#') or contains((.),'$') or contains((.),'%') or contains((.),'^') or contains((.),'&amp;') or contains((.),'*') or contains((.),'(') or contains((.),')') or contains((.),'+') or contains((.),'=') or contains((.),'{') or contains((.),'}') or contains((.),'[') or contains((.),']') or contains((.),'|') or contains((.),'\') or contains((.),':') or contains((.),';') or contains((.),'&lt;') or contains((.),'&gt;') or contains((.),'?') or contains((.),'/') or contains((.),',') or contains((.),'.')">Data entered - Accounting Station Number('<xsl:value-of select="string(.)"/>') may not have special characters <br/> 
    </xsl:if> 
</xsl:template> 

所以你可以看到,contains重复无处不在,在40个位次,是准确的。有没有更好的方法来做到这一点?喜欢使用matches,也许:

<xsl:variable name="illegalCharacters">! @ # $ %^&amp * () \ + = { } [ | ] \ \ : ; &lt &gt ?/, .</xsl:variable> 

<xsl:if test="matches((.),$illegalCharacters)"></xsl:if> 

甚至在XML的顶部声明,并做出,因为现在它使用无处不在,我有40位代码重复每一个模板:/

任何想法?

+0

为什么去了你的问题是标签的XSLT 1.0,如果您使用的是XSLT 2.0处理器?如果你不是,你为什么要改变样式表的版本? –

+0

@ michael.hor257k我标记v1.0,因为我不确定如何从1.0更改为2.0或者如果我做对了 – Angelina

+1

如果您的问题是关于XSLT 2.0,那么XSLT 1.0标记是无关紧要的。这两个版本都有更简单的解决方案,但是正则表达式只能在XSLT 2.0中使用。 –

回答

0

matches

<xsl:if test="not(matches(., '^[a-zA-Z0-9]+$'))"> 
      Data entered - Accounting Station Number('<xsl:value-of select="string(.)"/>') may not have special characters 
</xsl:if> 
1

我觉得@version应该是1.0或2.0的变化,不要认为这是一个版本的17

作为<xsl:if/>标签,我猜它落在一个节点相匹配的模板沿着<account-num/>

的功能,我不认为这些括号是必要的

<xsl:if test="contains((.),'!') or 
      contains(.,'@') or 
      contains(.,'#')"> 
    Data entered - Account Number <xsl:value-of select="string(.)"/> may 
    not have special characters <br/> 
</xsl:if> 
+0

我没有注意到版本,直到你指出:)谢谢。是的,代码是在每个模板。 – Angelina