0
這可能是不可能的,但能跟大家可能有一個答案, IM試着將這個XML分割分裂XML元素成許多
<CTP>
<name>ABSA bank</name>
<BAs.BA>bank|sector|issuer</BAs.BA>
</CTP>
,並把它轉換爲這種形式:
<CTP>
<name>ABSA bank</name>
<BAs>
<BA>bank</BA>
<BA>sector</BA>
<BA>issuer</BA>
</BAs>
</CTP>
我能做到這一點使用此代碼
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:str="http://exslt.org/strings" version="1.0" extension-element-prefixes="str">
<xsl:template name="str:tokenize">
<xsl:param name="string" select="''" />
<xsl:param name="delimiters" select="'	
'" />
<xsl:choose>
<xsl:when test="not($string) or (string-length($string)=0)" />
<xsl:when test="not($delimiters) or (string-length($delimiters)=0)">
<xsl:call-template name="str:_tokenize-characters">
<xsl:with-param name="string" select="$string" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="str:_tokenize-delimiters">
<xsl:with-param name="string" select="$string" />
<xsl:with-param name="delimiters" select="$delimiters" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="str:_tokenize-characters">
<xsl:param name="string" />
<xsl:if test="$string">
<BA>
<xsl:value-of select="substring($string, 1, 1)" />
</BA>
<xsl:call-template name="str:_tokenize-characters">
<xsl:with-param name="string" select="substring($string, 2)" />
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template name="str:_tokenize-delimiters">
<xsl:param name="string" />
<xsl:param name="delimiters" />
<xsl:variable name="delimiter" select="substring($delimiters, 1, 1)" />
<xsl:choose>
<xsl:when test="string-length($delimiter)=0">
<BA>
<xsl:value-of select="$string" />
</BA>
</xsl:when>
<xsl:when test="contains($string, $delimiter)">
<xsl:choose>
<xsl:when test="not(starts-with($string, $delimiter))">
<xsl:call-template name="str:_tokenize-delimiters">
<xsl:with-param name="string" select="substring-before($string, $delimiter)" />
<xsl:with-param name="delimiters" select="substring($delimiters, 2)" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<BA />
</xsl:otherwise>
</xsl:choose>
<xsl:call-template name="str:_tokenize-delimiters">
<xsl:with-param name="string" select="substring-after($string, $delimiter)" />
<xsl:with-param name="delimiters" select="$delimiters" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="str:_tokenize-delimiters">
<xsl:with-param name="string" select="$string" />
<xsl:with-param name="delimiters" select="substring($delimiters, 2)" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="/">
<xsl:variable name="v1">
<xsl:value-of select="CTP/BAs.BA" />
</xsl:variable>
<BAs>
<xsl:call-template name="str:tokenize">
<xsl:with-param name="string" select="$v1" />
<xsl:with-param name="delimiters" select="'#'" />
</xsl:call-template>
</BAs>
</xsl:template>
</xsl:stylesheet>
但主要的挑戰是如何使動態的,換句話說,我希望「的BA」 和「BA」節點,以動態寫入的情況下,我還有其他的XML,如:
<CTP>
<name>ABSA bank</name>
<FAs.FA>dep|sec|issue</BAs.BA>
</CTP>
我希望它看起來像這樣:
<CTP>
<name>ABSA bank</name>
<FAs>
<FA>bank</BA>
<FA>sector</BA>
<FA>issuer</BA>
</FAs>
</CTP>
的問題是不明確的。元素名稱中總會有兩個標記,還是可以有更多? –
作爲第一步,虐待它與2令牌,如果它的作品,我們會嘗試2+標記,但首先我的目標是實現2令牌的挑戰。 @ michael.hor257k –
@ michael.hor257k,你能否檢查第二步,你認爲這是可行的嗎? –