[英]XSLT value-of issue then value contains xml
我有输入数据:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="transform.xsl"?>
<objects>
<object>
<properties>
<property>
<label>This is a label. Label contains <reference ref="#">references</reference> in random <reference ref="#">places</reference></label>
</property>
</properties>
</object>
<object/>
</objects>
和转换文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" version="1.0" encoding="UTF-8"/>
<xsl:template match="/">
<html>
<body>
<xsl:for-each select="//objects/object">
<xsl:for-each select="properties/property">
<xsl:value-of select="label"/>
<xsl:for-each select="label/reference">
<a href="{@ref}"><xsl:value-of select="."/></a>
</xsl:for-each>
<br/>
</xsl:for-each>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
预期结果是:
但我得到:
如何解决这个问题?
在for-each
properties/property
for-each
迭代中,您将在label-text-node之后输出参考元素。 而是遍历所有node()并在节点类型之间进行选择:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" version="1.0" encoding="UTF-8"/>
<xsl:template match="/">
<xsl:element name="html">
<xsl:element name="body">
<xsl:for-each select="//objects/object">
<xsl:for-each select="properties/property">
<xsl:for-each select="label/node()">
<xsl:choose>
<xsl:when test="self::text()">
<xsl:value-of select="." />
</xsl:when>
<xsl:when test="local-name() = 'reference'">
<a href="{@ref}"><xsl:value-of select="." /></a>
</xsl:when>
</xsl:choose>
</xsl:for-each>
<xsl:element name="br" />
</xsl:for-each>
</xsl:for-each>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
这是一个经典情况,您应该使用模板规则而不是for-each。 用<xsl:apply-templates select="//objects"/>
替换最外面的for-each,然后执行
<xsl:template match="label/reference">
<a href="{@ref}"><xsl:value-of select="."/></a>
</xsl:template>
这就是您所需的一切:默认模板规则将处理所有其他事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.