【发布时间】:2014-01-24 21:12:27
【问题描述】:
我正在使用 XSLT 1.0 将一些 XML 转换为 JSON 输出。不幸的是,我正在使用的一些 XML 中包含 HTML 标记。下面是一些 XML 输入的示例:
<text>
Kevin Love and Steph Curry can talk about their first-
time starting gigs in the All-Star game Friday night when the Minnesota
Timberwolves visit Oracle Arena to face the Golden State Warriors.
</text>
<continue>
<P>
Love and Curry were two of four first-time All-Star starters when the league
made the announcement on Thursday.
</P>
<P>
Love got a late push to overtake Houston Rockets center Dwight Howard in the
final week of voting.
</P>
<P>
"I think it's a little sweeter this way because I really didn't expect it,"
Love said on a conference call. "I was already humbled by the response the
fans gave me to being very close to the top (frontcourt players). The outreach
by the Minnesota fans and beyond was truly amazing."
</P>
</continue>
标记并不理想,我需要在我的 JSON 输出中保留 <P> 标记。为了处理报价,我逃避它们。这是我处理此问题的模板:
<xsl:variable name="escaped-continue">
<xsl:call-template name="replace-string">
<xsl:with-param name="text" select="continue"/>
<xsl:with-param name="replace" select="'"'" />
<xsl:with-param name="with" select="'\"'"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="escaped-text">
<xsl:call-template name="replace-string">
<xsl:with-param name="text" select="text"/>
<xsl:with-param name="replace" select="'"'" />
<xsl:with-param name="with" select="'\"'"/>
</xsl:call-template>
</xsl:variable>
<xsl:template name="replace-string">
<xsl:param name="text"/>
<xsl:param name="replace"/>
<xsl:param name="with"/>
<xsl:choose>
<xsl:when test="contains($text,$replace)">
<xsl:value-of select="substring-before($text,$replace)"/>
<xsl:value-of select="$with"/>
<xsl:call-template name="replace-string">
<xsl:with-param name="text"
select="substring-after($text,$replace)"/>
<xsl:with-param name="replace" select="$replace"/>
<xsl:with-param name="with" select="$with"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
然后我只需使用类似以下的内容来输出 JSON:
{
"text": "<xsl:value-of select="normalize-space($escaped-text)"/>",
"continue": "<xsl:value-of select="normalize-space($escaped-continue)"/>"
}
我在这里遇到的问题是输出看起来像这样:
{
"text": "Kevin Love and Steph Curry can talk about their first- time starting gigs in the All-Star game Friday night when the Minnesota Timberwolves visit Oracle Arena to face the Golden State Warriors.",
"continue": "Love and Curry were two of four first-time All-Star starters when the league made the announcement on Thursday. Love got a late push to overtake Houston Rockets center Dwight Howard in the final week of voting. \"I think it's a little sweeter this way because I really didn't expect it,\" Love said on a conference call. \"I was already humbled by the response the fans gave me to being very close to the top (frontcourt players). The outreach by the Minnesota fans and beyond was truly amazing.\"
}
如您所见,双引号已正确转义,但 <P> 标记已被 XSLT 解析器直接剥离和/或解析,然后被 normalize-space() 抑制。在此处将<P> 标签重新添加到我的输出中的最佳方法是什么?
【问题讨论】:
-
实际上,我认为这里的问题是您首先将文本提取到您的
escaped-text中。如果您想要其中的元素,您需要的不仅仅是文本节点。