2013-05-20 37 views
2

我想从具有混合子节点的xml文件中的节点中提取内容。这里是布局的副本:从xml文件中提取混合数据

<content> 
    bla bal bla... 
    <p /> 
    <img url="me3_img1.jpg"></img>blaa bal 
    bla laal laal 
    <p /> 
</content> 

的“P”标签建议以下内容(图片和文字)应该被放置到下一段。图像将使用html创建,其中图像的来源是xml中自定义img标签的URL属性。

因此,输出将是:

<div> 
    <p> 
     bla bal bla... 
    </p> 

    <p> 
     <img src = "me3_img1.jpg"/>blaa bal 
     bla laal laal 
    </p> 
    </div> 

这将有助于知道从哪里开始,或者对如何做到这一个基本思路。 (PS:我们只允许使用XPath和XSLT 1.0版本)

我已成功地做到以下几点:

<xsl:for-each select="./review/content/*"> 
    <xsl:if test="self::text()"> 
    Display text 
    </xsl:if> 
    <xsl:if test="self::p"> 
    <br/> 
    </xsl:if> 
    <xsl:if test="self::img"> 
    Display image 
    </xsl:if> 
</xsl:for-each> 

自:: P测试和自我:: IMG测试工作,但self :: text()测试不起作用。我在这里做错了什么?

+0

这不是XML,你应该关闭''标签。要获取所有文本内容,请使用'// text()'。无法使用普通XPath/XSLT加载任何图像内容;你将需要重新指定在这里会发生什么。您可能需要启用空白保留才能得到完全的结果,具体取决于所选的处理器。 –

+1

你真的只想输出文字,还是输出HTML?如果您要输出HTML,那么如果您在预期的输出中显示实际的HTML标签,这将有所帮助。谢谢! –

回答

1

如果XML是这样的:

<content> 
    bla bal bla... 
    <p /> 
    <img url="me3_img1.jpg">blaa bal</img> 
    bla laal laal 
    <p /> 
</content> 

试试这个:

<xsl:for-each select="review/content/node()"> 
     <xsl:choose> 
      <xsl:when test=". = not(node())"> 
       <p><xsl:value-of select="./preceding::text()[1]" /></p> 
      </xsl:when> 
      <xsl:when test=". = text()"> 
       <img><xsl:attribute name="src">url('<xsl:value-of select="./@url" />' </xsl:attribute></img> 
       <p><xsl:value-of select="." /></p> 
      </xsl:when> 
     <xsl:otherwise/> 
    </xsl:choose> 
</xsl:for-each> 
+0

感谢您的帮助。我正在尝试制作一个html文档,而不是pdf。但是我用你的测试=“。= text()”。现在我得到了一些输出,但只是部分文本。 – user2342875

+0

经过修改后,谢谢你的工作! – user2342875