2014-02-17 33 views
0

正在寫一些XSLT腳本(1.0版本)句號,VS2010在XSLT如何找到如果文本包含在BizTalk映射到底

現在,在輸入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> 

但我只想要刪除 「」這在最後出現。我怎麼做?任何建議都非常感謝。

在此先感謝。

+0

[在XSLT串卸下的最後一個字符]的可能重複(http://stackoverflow.com/questions/1119449/removing -XSLT字符串中的最後字符) – Tomalak

回答

0

編輯請注意,這是一個XSLT 2.0的答案。如果它根本沒用,我會刪除它。

測試您的條件(.在字符串末尾)是否符合matches()函數和正則表達式。你會發現這個here小提琴。

如果matches()返回true,則輸出排除最後一個字符的輸入文本的子字符串。換句話說,它返回從第一個字符(索引1)開始並且長度爲string-length() -1的子字符串$replace1

請注意,我冒昧地從樣式表中刪除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> 
+0

問題要求XSLT 1.0。 –

+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) = '.'))"/> 
+0

聰明,我喜歡它:-) –

+0

@IanRoberts哦,天哪。我相信你的意思是作爲讚美,但我發誓我會停止做「聰明」和「可愛的伎倆」。顯然我有一次復發。我會編輯我的答案,併發佈一個不那麼「聰明」和更直接的方法。 –