2015-12-03 23 views
0

我有輸入數據:XSLT價值的問題,那麼值包含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> 

預期的結果是:

這是一個標籤。標籤包含references隨機places

,但我發現:

這是一個標籤。標籤在隨機地方包含參考referencesplaces

如何解決該問題?

回答

0

在您的for-each迭代properties/property您正在標籤文本節點後面輸出引用元素。相反,遍歷所有節點()的和節點類型之間進行選擇:

<?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> 
0

這是一個經典的案例,你應該使用的模板規則,而不是-每個。與<xsl:apply-templates select="//objects"/>更換你的,最外側,然後做

<xsl:template match="label/reference"> 
    <a href="{@ref}"><xsl:value-of select="."/></a> 
</xsl:template> 

這就是你需要:一切由默認的模板規則的照顧。