所以,我对XSLT一无所知。我不知道我在做什么,我不知道我应该让代码做什么,而且我不知道如何让它做它应该做的任何事情。
话虽这么说,我知道我应该将名字截断为前五个字符。
我有这个:
<xsl:if test="string-length(/myQuery/Arguments/FirstName) >= 6">
<xsl:variable name = "x" select = "substring(/myQuery/Arguments/FirstName, 1, 5)"/>
</xsl:if>
因此, 将FirstName的截断版本分配给X.但是如何将其重新置换为FirstName?
答案 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(.) > 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还有很多,但我希望能帮到你。