在xslt中如何查找文本是否包含完整句点

时间:2014-02-17 11:58:49

标签: xml xslt

我在BizTalk映射器VS2010中编写了一些xslt脚本(版本1.0)

现在在输入xml文件中,我有以下标记

<STUDENTS>
<STUDENT>&lt;DETAILS NAME="Tuna"&gt;These are student. details. of Student1.&lt;/DETAILS&gt;</STUDENT>
<STUDENT></STUDENT>
</STUDENTS>

现在对于上面的每个,输出必须如下所示

<INFO NAME="Tuna">These are student. details. of Student1</INFO>

使用以下脚本。

<xsl:for-each select="//STUDENTS/STUDENT">
<INFO>
<xsl:attribute name="NAME">
    <xsl:value-of select="normalize-space(substring-before(substring-after(.,'NAME=&quot;'),'&quot;'))" />
  </xsl:attribute>
  <xsl:variable name="replace1" select="normalize-space(substring-before(substring-after(.,'&gt;'),'&lt;/DETAILS&gt;'))" />  
<xsl:value-of select="translate($replace1,'.','')"/>  
</INFO>
</xsl:for-each>

我的输出如下所示

<INFO NAME="Tuna">These are student details of "Student1" </INFO>

但我只想删除“。”最后出现。我怎么做?任何建议都非常感谢。

提前致谢。

2 个答案:

答案 0 :(得分:1)

  

写了一些xslt脚本(版本1.0)

如果您使用的是XSLT 1.0,请尝试以下方法:

<xsl:value-of select="substring($replace1, 1, string-length($replace1) - contains(concat($replace1, '§'), '.§'))"/>  

或者,最好是:

<xsl:value-of select="substring($replace1, 1, string-length($replace1) - (substring($replace1, string-length($replace1), 1) = '.'))"/> 

答案 1 :(得分:0)

编辑请注意,这是XSLT 2.0的答案。如果完全没用,我会删除它。

测试.函数和正则表达式是否满足条件(字符串末尾的matches())。你会找到这个here的小提琴。

如果matches()返回true,则输出排除最后一个字符的输入文本的子字符串。换句话说,它从第一个字符(索引1)和长度$replace1开始返回string-length() -1的子字符串。

请注意,我已经冒昧从样式表中删除xsl:for-each。在许多情况下,使用模板是一种更好的方法。

<强>样式表

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

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

   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="/STUDENTS">
      <xsl:copy>
         <xsl:apply-templates/>
      </xsl:copy>
   </xsl:template>

   <xsl:template match="STUDENT">
      <INFO>
         <xsl:attribute name="NAME">
            <xsl:value-of select="normalize-space(substring-before(substring-after(.,'NAME=&quot;'),'&quot;'))" />
         </xsl:attribute>
         <xsl:variable name="replace1" select="normalize-space(substring-before(substring-after(.,'&gt;'),'&lt;/DETAILS&gt;'))" />  

         <xsl:choose>
            <xsl:when test="matches($replace1,'\.$')">
               <xsl:value-of select="substring($replace1,1,string-length($replace1)-1)"/>
            </xsl:when>
            <xsl:otherwise>
               <xsl:value-of select="$replace1"/>
            </xsl:otherwise>
         </xsl:choose>
      </INFO>
   </xsl:template>

</xsl:stylesheet>

<强>输出

<?xml version="1.0" encoding="UTF-8"?>
<STUDENTS>
   <INFO NAME="Tuna">These are student. details. of Student1</INFO>
   <INFO NAME=""/>
</STUDENTS>