1

嘿,如果有人对如何从 XML 文件中获取换行符并使用 XSL 转换将它们转换为段落有任何建议,我正在徘徊。

下面是 XML 结构的样子:

<?xml version="1.0" encoding="ISO-8859-1"?>

<document>
<book>
<issue>1</issue>
<body>
“Dude, I can't believe you fed it to your cat.  That's crazy!” 

“Yeah, dude, he just cuddled up next to me and started purring.”

“Then what did he do?”

“He just kept purring, man.  He's been purring non-stop for like two weeks now.  I can't even sleep.”  
</body>
</book>
</document>

这是我用于转换的 XSL 表的副本。

<?xml version="1.0" encoding="ISO-8859-1"?>
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"    xmlns="http://www.w3.org/1999/xhtml">

<body style="font-family:Arial;font-size:12pt;">

<xsl:for-each select="document/book">

<div style="color:red; padding:4px;">
<span style="font-weight:bold">
</span> Chapter 
<xsl:value-of select="info/issue"/>
</div>
<div style="margin-left:10px; margin-bottom:1em; margin-right:25px; font-size:10pt;">
<span>
<xsl:value-of select="body"/>
</span>
</div>

</xsl:for-each>
</body>
</html>

同样,我的问题是关于使用哪些命令来使用现有的 XSL 文档来保留段落结构。

谢谢, 乙

4

2 回答 2

1

This transformation:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="body/text()" name="replaceNL">
  <xsl:param name="pText" select="."/>

  <xsl:if test="string-length($pText)">
   <xsl:choose>
    <xsl:when test="not(contains($pText, '&#xA;'))">
      <xsl:value-of select="$pText"/>
    </xsl:when>
    <xsl:otherwise>
     <p>
       <xsl:value-of select=
       "substring-before($pText,'&#xA;')"/>
     </p>
     <xsl:call-template name="replaceNL">
      <xsl:with-param name="pText" select=
       "substring-after($pText,'&#xA;')"/>
     </xsl:call-template>
    </xsl:otherwise>
   </xsl:choose>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

when applied on the provided XML document:

<document>
<book>
<issue>1</issue>
<body>
“Dude, I can't believe you fed it to your cat.  That's crazy!”

“Yeah, dude, he just cuddled up next to me and started purring.”

“Then what did he do?”  “He just kept purring, man.  He's been purring non-stop for like two weeks now.  I can't even sleep.”
</body>
</book>
</document>

produces the wanted, correct result:

<document>
   <book>
      <issue>1</issue>
      <body>
         <p/>
         <p>“Dude, I can't believe you fed it to your cat.  That's crazy!”&lt;/p>
         <p>        </p>
         <p>“Yeah, dude, he just cuddled up next to me and started purring.”&lt;/p>
         <p>        </p>
         <p>“Then what did he do?”  “He just kept purring, man.  He's been purring non-stop for like two weeks now.  I can't even sleep.”&lt;/p>
      </body>
   </book>
</document>

Explanation: The identity rule + a recursive named template for wrapping into a p each text substring surrounded by NL characters.

于 2011-04-01T13:40:13.623 回答
0

看看 FXSL 1.2,http://sourceforge.net/projects/fxsl/。我无法回答这个项目的质量和实用性,但至少它包含很多东西和一些你可能需要的东西。

否则,攻击将是选择正文的文本节点并使用 substring-before 和 substring-after 函数递归地创建新的文本节点,并用“p”节点包围每个新的文本节点。递归位可能是棘手的部分,但上面提到的代码中有很多示例。

于 2011-03-31T15:32:45.047 回答