在XSLT中,如何将值截断为前五个字符?

时间:2014-12-02 20:10:06

标签: xml xslt

所以,我对XSLT一无所知。我不知道我在做什么,我不知道我应该让代码做什么,而且我不知道如何让它做它应该做的任何事情。

话虽这么说,我知道我应该将名字截断为前五个字符。

我有这个:

<xsl:if test="string-length(/myQuery/Arguments/FirstName) &gt;= 6">
<xsl:variable name = "x" select = "substring(/myQuery/Arguments/FirstName, 1, 5)"/>
</xsl:if>

因此, 将FirstName的截断版本分配给X.但是如何将其重新置换为FirstName?

2 个答案:

答案 0 :(得分:2)

使用identity transform,然后覆盖您尝试更改的内容......

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

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

    <xsl:template match="FirstName[string-length(normalize-space())>=6]/text()">
        <xsl:value-of select="substring(normalize-space(),1,5)"/>
    </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:1)

你没有给我们太多的工作,但让我们从这开始:XSLT处理器不会修改任何东西。而是需要XML输入并且生成转换后的版本(不一定是XML)。

对XSL进行逆向工程使我相信您的输入文档看起来像这样:

<?xml version="1.0"?>
<myQuery>
  <Arguments>
    <FirstName>Jonathon</FirstName>
  </Arguments>
</myQuery>

如果目标是生成一个相同的文档,除了截断<FirstName>元素中的文本,那么它可能如下所示:

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

  <!-- by default, transform every node and attribute into a copy of itself -->
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- Where needed, transform FirstName elements with truncation -->
  <xsl:template match="/myQuery/Arguments/FirstName[string-length(.) &gt; 5]">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:value-of select="substring(., 1, 5)" />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

通过该样式表转换上面的示例输入产生

<?xml version="1.0"?>
<myQuery>
<Arguments>
<FirstName>Jonat</FirstName>
</Arguments>
</myQuery>

注意事项:

  • <xsl:template>元素定义了如何转换输入文档的不同部分。通过XPath表达式选择文档部分;转换由模板的主体表示。
  • 如果要生成与原始文档差别很小的转换文档,则可以大大简化使用标识转换的内容,例如上面样式表中首先出现的内容。
  • 最多选择一个模板来转换输入文档中的任何给定节点。当多个匹配给定节点时,存在用于选择使用哪个节点的优先级规则。几乎任何事物都优先于给定身份变换中的选择器,并且优先级相同,选择样式表中最后出现的模板。

XSLT还有很多,但我希望能帮到你。