簡體   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