2016-07-05 36 views
0

我不熟悉XSL並需要專家的幫助。 試着只轉換 <RiskType>Risk1, Risk2, Risk3</RiskType>XSL根據分隔符分割字符串但保留所有其他標籤相同

<RiskType>Risk1</RiskType>

<RiskType>Risk2</RiskType>

<RiskType>Risk3</RiskType>

但我必須保持一切完好無損。基於其他文章,我試圖使用XSL,但它似乎做到了上述情況,但破壞了結構和其他標籤。

<Policy>

<PolNumber>123456789</PolNumber> 
<LineOfBusiness tc="1">Life</LineOfBusiness> 
<Life> 
    <Coverage id=""> 
     <LifeCovTypeCode tc="123">Child Term Rider</LifeCovTypeCode> 
     <NumChildren>2</NumChildren> 
    </Coverage> 
    <PlanName>MyPlan</PlanName> 
</Life> 
    <ApplicationInfo> 
    <OLifeEExtension> 
     <RiskTypes> 
      <RiskType>Risk1, Risk2, Risk3</RiskType> 
     </RiskTypes> 
    </OLifeEExtension> 
    </ApplicationInfo> 
</Policy> 

<Policy>

<PolNumber>123456789</PolNumber> 
<LineOfBusiness tc="1">Life</LineOfBusiness> 
<Life> 
    <Coverage id=""> 
     <LifeCovTypeCode tc="123">Child Term Rider</LifeCovTypeCode> 
     <NumChildren>2</NumChildren> 
    </Coverage> 
    <PlanName>MyPlan</PlanName> 
</Life> 
    <ApplicationInfo> 
    <OLifeEExtension> 
     <RiskTypes> 
      <RiskType>Risk1</RiskType> 
      <RiskType>Risk2</RiskType> 
      <RiskType>Risk3</RiskType> 
     </RiskTypes> 
    </OLifeEExtension> 
    </ApplicationInfo> 
</Policy> 

XSL不起作用

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

<!-- Main template --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()" mode="tokenize-children" /> 
    </xsl:copy> 
</xsl:template> 

<!-- Split child nodes --> 
<xsl:template match="*" mode="tokenize-children"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*" /> 
     <xsl:apply-templates select="*" mode="tokenize" /> 
    </xsl:copy> 
</xsl:template> 

<!-- Tokenize text node of child nodes --> 
<xsl:template match="*/text()" name="tokenize" mode="tokenize"> 
    <xsl:param name="text" select="."/> 
    <xsl:param name="separator" select="','"/> 

    <xsl:variable name="item" select="name(..)" /> 

    <xsl:choose> 
     <xsl:when test="not(contains($text, $separator))"> 
      <xsl:element name="{$item}"> 
       <xsl:value-of select="normalize-space($text)"/> 
      </xsl:element> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:element name="{$item}"> 
       <xsl:value-of select="normalize-space(substring-before($text, $separator))"/> 
      </xsl:element> 
      <xsl:call-template name="tokenize"> 
       <xsl:with-param name="text" select="substring-after($text, $separator)"/> 
      </xsl:call-template> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

回答

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="RiskType"> 
    <xsl:call-template name="tokenize"> 
     <xsl:with-param name="text" select="."/> 
    </xsl:call-template> 
</xsl:template> 

<xsl:template name="tokenize"> 
    <xsl:param name="text"/> 
    <xsl:param name="delimiter" select="', '"/> 
     <xsl:variable name="token" select="substring-before(concat($text, $delimiter), $delimiter)" /> 
     <xsl:if test="$token"> 
      <RiskType> 
       <xsl:value-of select="$token"/> 
      </RiskType> 
     </xsl:if> 
     <xsl:if test="contains($text, $delimiter)"> 
      <!-- recursive call --> 
      <xsl:call-template name="tokenize"> 
       <xsl:with-param name="text" select="substring-after($text, $delimiter)"/> 
      </xsl:call-template> 
     </xsl:if> 
</xsl:template> 

</xsl:stylesheet> 

或者,如果你喜歡:

<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="RiskType" name="tokenize"> 
    <xsl:param name="text" select="."/> 
    <xsl:param name="delimiter" select="', '"/> 
     <xsl:variable name="token" select="substring-before(concat($text, $delimiter), $delimiter)" /> 
     <xsl:if test="$token"> 
      <RiskType> 
       <xsl:value-of select="$token"/> 
      </RiskType> 
     </xsl:if> 
     <xsl:if test="contains($text, $delimiter)"> 
      <!-- recursive call --> 
      <xsl:call-template name="tokenize"> 
       <xsl:with-param name="text" select="substring-after($text, $delimiter)"/> 
      </xsl:call-template> 
     </xsl:if> 
</xsl:template> 

</xsl:stylesheet> 
+0

我想添加一個計數器到RiskType標記,例如。如何添加它們? – user1747980

+0

向遞歸模板添加一個計數器參數,並在每次調用時增加它。 - 請注意編號元素通常是不好的做法。 –

+0

謝謝。得到它了 ! – user1747980