繁体   English   中英

XSLT价值问题,那么价值包含xml

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM