2011-04-11 28 views
2

我是XSLT新手。我已經閱讀了教程,並且已經能夠使用我的XML文檔完成我想要的大約80%。但是,我被困在某些東西上。在我的XML文檔中,我具有包含「ERA」,「EDA」,「EDAR」等值的屬性。從本質上講,這些屬性由字母E,d,A和R的E,d,A和R的地圖組合,以編輯刪除添加XSLT:分割一個字符串並對每個字符進行操作

如果我這樣做勢在必行,我將字符串分割成其組件中的字符,然後檢查每個字符,看是否我應該輸出編輯刪除添加,或。我如何在XSLT中做類似的事情?我正在考慮使用長度和子字符串函數並進行某種循環。

回答

1

在線(或外部)圖:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:local="http://localhost"> 
    <local:map letter="E" text="Edit"/> 
    <local:map letter="D" text="Delete"/> 
    <local:map letter="A" text="Add"/> 
    <local:map letter="R" text="Read"/> 
    <xsl:template match="test"> 
     <xsl:copy> 
      <xsl:apply-templates 
      select="document('')/*/local:map[ 
         contains(current(),@letter) 
        ]/@text" 
      mode="sequence"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="node()|@*" mode="sequence"> 
     <xsl:value-of select="concat(substring(' ', 1 div (position()!=1)),.)"/> 
    </xsl:template> 
</xsl:stylesheet> 

輸出:

<test>Edit Delete Add Read</test> 

序列的xsl:if說明:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="test"> 
     <xsl:copy> 
      <xsl:if test="contains(.,'E')">Edit </xsl:if> 
      <xsl:if test="contains(.,'D')">Delete </xsl:if> 
      <xsl:if test="contains(.,'A')">Add </xsl:if> 
      <xsl:if test="contains(.,'R')">Read </xsl:if> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

輸出:

<test>Edit Delete Add Read </test> 
0

我能夠通過使用遞歸函數/模板來解決這個問題:

<xsl:template name="translateAccessModes"> 

<xsl:param name="accessModes" /> 

<xsl:if test="string-length($accessModes) > 0"> 

    <xsl:variable name="accessMode" select="substring($accessModes, 1, 1)" /> 
    <xsl:choose> 
    <xsl:when test="$accessMode='E'">Edit </xsl:when> 
    <xsl:when test="$accessMode='D'">Delete </xsl:when> 
    <xsl:when test="$accessMode='A'">Add </xsl:when> 
    <xsl:when test="$accessMode='R'">Read </xsl:when> 
    <xsl:otherwise>Unrecognized Access Mode: <xsl:value-of select="$accessMode" /> </xsl:otherwise> 
    </xsl:choose> 

    <xsl:call-template name="translateAccessModes"> 
    <xsl:with-param name="accessModes" select="substring($accessModes, 2, string-length($accessModes))" /> 
    </xsl:call-template> 

</xsl:if> 

</xsl:template> 

不知道這是做的最好的辦法,但。

1

假設屬性只包含EDA和R(或者你不關心其他可能的值),在<xsl:choose...>一組簡單的contains(@attr,...)應該很好地工作:

<xsl:choose> 
    <xsl:when test="contains(@attr,'A')"> 
    ... 
    </xsl:when> 
    <xsl:when test="contains(@attr,'D')"> 
    ... 
    </xsl:when> 
    etc... 
</xsl:choose> 
+0

是的,它只會包含E,d,A,R。這似乎是一個更容易的方法! – 2011-04-12 15:12:27

+0

這並不能解決**每個字母**的問題。 – 2011-04-12 22:35:56

+0

@Alejandro,它會對每個''進行測試嗎?或者當其中一個子句匹配時,是否突破''? – 2011-04-12 22:48:27

相關問題