XSLT新手求助:含XML标签的文本截取实现方案
处理XML文本截取(兼顾标签结构)的XSLT方案
刚接触XSLT遇到这类和标签交互的文本处理问题很正常,咱们一步步来解决你的需求。首先先明确你的场景:你有一段带结构化标签的XML,需要对其中的文本内容做截取,但得保证XML的标签结构不被破坏对吧?
先把你提供的示例XML整理成更易读的格式:
<ABCGEFGH> <SYSTEMINFO>2432048324884329</SYSTEMINFO> <PARENT>0000001200003100569DDA0000000000000000080595</PARENT> <DETAIL>007542038808460056</DETAIL> </ABCGEFGH>
根据你提到的XSLT 1.0版本,我给你两种常用的解决方案:
方案一:全局截取所有文本节点(保留标签结构)
这个方案会对XML里所有的文本内容做截取,同时完整保留原有的标签结构。核心思路是用身份模板复制所有节点,再单独匹配文本节点做截取:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 身份模板:原样复制所有节点、属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配所有文本节点,截取前15个字符(可自行调整长度) --> <xsl:template match="text()"> <xsl:value-of select="substring(., 1, 15)"/> </xsl:template> </xsl:stylesheet>
比如用这个XSLT处理你的示例XML,<PARENT>的内容会被截成000000120000310,其他元素的文本也会按同样规则截取,标签完全保留。
方案二:只针对特定元素的文本截取
如果你只需要处理某个特定元素(比如<PARENT>)的文本,其他元素保持不变,可以修改文本匹配的模板,指定目标元素:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 身份模板:原样复制所有节点、属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 只匹配<PARENT>下的文本节点,截取前20个字符 --> <xsl:template match="PARENT/text()"> <xsl:value-of select="substring(., 1, 20)"/> </xsl:template> </xsl:stylesheet>
这个方案只会修改<PARENT>的内容,<SYSTEMINFO>和<DETAIL>的文本会完全保留。
如果你的需求更特殊(比如要把所有文本拼接后再截取,同时还原标签结构),可以再补充说明具体场景,我再帮你调整方案~
内容的提问来源于stack exchange,提问作者Ranjith
相关产品推荐
相关产品推荐

