【发布时间】:2015-12-26 07:02:15
【问题描述】:
巨大的免责声明:这仅适用于您处理生成的 html 表单时使用的内容不能原生翻译 HTML 实体双引号的内容,否则 XSLT 处理器应该负责生成即使在正常的双引号包裹的属性。 (例如")。我当然意识到只有在我写完之后,转义的双引号才真正满足我的需要,因为我尝试的第一件事是单引号,它没有解析为 JSON,而且我之前遇到过敏感的 JSON 解析情况所以我什至没想过只使用元素转义的双引号,但这可能仍然有利于其他一些情况(请参阅:敏感的 JSON 解析情况),所以我将继续发布它。
简而言之:您不需要为 JSON 执行所有这些操作,它将由基于现代浏览器的解析器执行。 HTML 实体双引号 (") 是它们的有效分隔符(是的,甚至是 IE)。
我遇到了一个令人沮丧的难题,即通过 XSLT 将 JSON 构建到 HTML 元素的属性中(特别是用于初始化滑块的 HTML5 数据属性)。
XSLT 只处理包含在双引号内的属性。 (注意:如果有一个可以交换它的处理标志/指令,它必须是我可以从工作表内部调用的,而不是从对处理器的发起调用中调用的,因为我无法控制它)。
JSON 需要双引号才有效。
关键处理细节:我在 Saxon 9.3.0.5 中工作,它被一个我无法直接访问修改的系统调用和初始化(专有 CMS 代码)。
我可能(?)可以在 javascript 中解决这个问题,但如果有一个我忽略的原生 XSLT 解决方案,那么很高兴知道。我假设没有,因为有一个 comment from Michael Kay 从 2013 年开始,他开玩笑说属性包装选择一直是不可变的,因为应该没有任何世俗的理由需要来改变它。到目前为止,我通常会同意,因为在双引号属性中,JSON 的单引号实际上是无效的 JSON。 编辑:请参阅免责声明,他可能仍然适用于 99% 的 JSON 相关案例。
我可能会在脚本元素或类似元素中构建一个单独的 JSON 字符串,然后在相关的滑块函数在此运行之前通过 javascript 将其注入属性中,这可能是我应该当我重构这个时做,但我想知道还有哪些其他选项,如果有的话。
我将使用不是真正原生/正确的 XSLT 解决方案来解决这个问题,该解决方案对于遇到类似问题的其他人来说非常有用,但我真的想要更好的东西,如果它出来了在那里,因为我讨厌在 XSL 中使用这种类型的 hack。
示例代码(减去很多周围的匹配项、身份 xform 等):
(问题特定于像这样将“data-slick”属性添加到匹配的ul)
<xsl:template match="mus:call-template[@name='slick-slider-carousel']//ul">
<xsl:param name="slider-options" tunnel="yes" />
<xsl:param name="pcf-context" tunnel="yes" />
<xsl:copy copy-namespaces="no">
<xsl:apply-templates select="@attribute" />
<xsl:attribute name="data-slick"><xsl:text>{</xsl:text>
<xsl:apply-templates select="$slider-options" />
<xsl:text>}</xsl:text>
</xsl:attribute>
<xsl:apply-templates select="$pcf-context/gallery/images/image" mode="slick-slider">
<xsl:with-param name="asset-id" select="$pcf-context/gallery/@asset-id" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
示例 html 布局表:
<mus:call-template name="slick-slider-carousel">
<div class="image-carousel">
<ul>
</ul>
</div>
</mus:call-template>
从内容表加载到 $pcf-context 的示例树片段(通过 xsl:sequence):
<gallery created="2015-03-25T21:18:20Z" forceCrop="false" modified="2015-03-25T21:19:31Z" asset_id="649">
<name>Test</name>
<thumbnailWidth>100</thumbnailWidth>
<thumbnailHeight>100</thumbnailHeight>
<forceCrop>false</forceCrop>
<advanced>
</advanced>
<images>
<image created="2015-03-25T21:18:53Z" modified="2015-03-25T21:18:53Z" staging_url="[full-url]/6d640b3f-7e50-4bdf-802d-2d5e33955ed1.jpeg" url="[full-url]/6d640b3f-7e50-4bdf-802d-2d5e33955ed1.jpeg" status="existing">
<storedName>6d640b3f-7e50-4bdf-802d-2d5e33955ed1.jpeg</storedName>
<friendlyName>d01454b9-5eab-4a7f-b999-3ec92313b193.jpeg</friendlyName>
<thumbnail staging_url="[full-url]/thumb/6d640b3f-7e50-4bdf-802d-2d5e33955ed1.jpeg" url="[full-url]/6d640b3f-7e50-4bdf-802d-2d5e33955ed1.jpeg">
<width>100</width>
<height>100</height>
</thumbnail>
<title>A very cute puppy</title>
<description>Cute puppy</description>
<caption>Look at that cute puppy! lorem ipsum blah blah blah</caption>
<link>
</link>
</image>
</images>
</gallery>
【问题讨论】: