有一个xml(例如xml被简化)
<object attr1="1" attr2="2">
xxxxxxxxx
<someattrs>
<someattr1>a</someattr1>
<someattr2>b</someattr2>
<someattr3>c</someattr3>
<someattr4 attr3="3">
yyyyyyy
<someattr5>d</someattr5>
<someattr6>e</someattr6>
<someattr7 attr8="f">
<![CDATA[ zzzzzzz zzzzzz zzzzzz zzzzzzzzzzzz ]]>
</someattr7>
</someattr4>
</someattrs>
</object>
使用xls转换,用于将任何具有属性的xml转换为以元素为中心的xml :
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*">
<xsl:element name="{name()}"><xsl:value-of select="."/></xsl:element>
</xsl:template>
</xsl:stylesheet>
xml转换为
<?xml version="1.0" encoding="UTF-8"?>
<object>
<attr1>1</attr1>
<attr2>2</attr2>
xxxxxxxxx
<someattrs>
<someattr1>a</someattr1>
<someattr2>b</someattr2>
<someattr3>c</someattr3>
<someattr4>
<attr3>3</attr3>
yyyyyyy
<someattr5>d</someattr5>
<someattr6>e</someattr6>
<someattr7>
<attr8>f</attr8>
zzzzzzz zzzzzz zzzzzz zzzzzzzzzzzz
</someattr7>
</someattr4>
</someattrs>
</object>
问题是源xml中出现的任何自由文本()都没有进入它自己的标签(让所有自由文本放在名为“sometext”的元素中)在最终的xml中。文本“xxxxxxxxx”应该放在自己的标记<sometext>xxxxxxxxx</sometext>
中,而“yyyyyyy”应该放在自己的标记<sometext>yyyyyyy</sometext>
中。
获取以下xml的转换是什么?
<?xml version="1.0" encoding="UTF-8"?>
<object>
<attr1>1</attr1>
<attr2>2</attr2>
<sometext>xxxxxxxxx</sometext>
<someattrs>
<someattr1>a</someattr1>
<someattr2>b</someattr2>
<someattr3>c</someattr3>
<someattr4>
<attr3>3</attr3>
<sometext>yyyyyyy</sometext>
<someattr5>d</someattr5>
<someattr6>e</someattr6>
<someattr7>
<attr8>f</attr8>
<sometext>zzzzzzz zzzzzz zzzzzz zzzzzzzzzzzz</sometext>
</someattr7>
</someattr4>
</someattrs>
</object>
答案 0 :(得分:1)
摆脱仅格式化的文本节点:
<xsl:strip-space elements="*"/>
从纯文本节点创建<sometext>
个元素。
<xsl:template match="object/text()">
<sometext><xsl:value-of select="normalize-space(.)"/></sometext>
</xsl:template>
更新
任何元素的一般解决方案:
<xsl:template match="*[*|@*]/text()">
<sometext><xsl:value-of select="normalize-space(.)"/></sometext>
</xsl:template>
答案 1 :(得分:1)
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*">
<xsl:element name="{name()}"><xsl:value-of select="."/></xsl:element>
</xsl:template>
<xsl:template match="*[@*]/text()">
<sometext><xsl:value-of select="normalize-space(.)"/></sometext>
</xsl:template>
</xsl:stylesheet>