2011-04-11 29 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

相关问题