使用XSLT在XML文件中保留粗体和斜体html标签

时间:2018-07-15 18:22:52

标签: xml xslt adobe-indesign

我需要将一些事件XML导入InDesign。我正在使用XSLT对事件列表进行重新排序和排序。为了引入<eventContent>,我使用的是“ copy-of”,以便保留斜体和粗体标签。但是,InDesign只是将<eventContent>作为大块文本导入,而忽略段落返回。当我使用“ value-of”时,它将保留段落的返回值,但会拉出斜体和粗体标签。

<eventlist>
<event>
    <eventTime>12:00AM</eventTime>
    <eventTitle>Movie Night</eventTitle>
    <eventContent>
        <p>Come to the movie night at the new <strong>Middle School</strong></p>
        <p>We will be showing the movie <em>Sing</em></p>
    </eventContent>
</event>
<event>
    <eventTime>05:00AM</eventTime>
    <eventTitle>Dance Party</eventTitle>
    <eventContent>
        <p>Dance at the park!</p>
        <p>Be sure to <strong>bring your own booze</strong>!</p>
    </eventContent>
</event>
</eventlist>

是否有一段代码可以让我插入<eventContent>并保持段落返回?

我是否要在XSLT中添加一个模板,以使其在<eventContent>中循环以向每个<p>添加一个段落返回代码?

<?xml version="1.0"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"  indent="yes"/>
<xsl:template match="/">

<Root>

<xsl:for-each select="eventlist">
    <eventlist>
    <xsl:for-each select="event">
        <event>
            <eventTime><xsl:value-of select="eventTime"/></eventTime>
            <eventTitle><xsl:value-of select="eventTitle"/></eventTitle>
            <eventContent><xsl:copy-of select="eventContent"/></eventContent>
        </event>
    </xsl:for-each>
    </eventlist>
</xsl:for-each>

</Root>
</xsl:template>

<xsl:template match = "//p" >
    <p><xsl:copy-of select = "." /></p><xsl:text>&#13;</xsl:text> 
</xsl:template>

</xsl:stylesheet>

2 个答案:

答案 0 :(得分:1)

  

InDesign只是将其作为大块文本导入,而忽略段落返回。

检查您的InDesign XML导入选项。如果选中了“不导入仅包含空格的元素的内容”,则将删除任何单个“空白”外部标签,内部标签的开头或结尾,您将获得此文本块。 解决方案是要么取消选中它(但缩进将作为常规文本安装),要么实现回车编码的字符,例如Nicolai提供的。

答案 1 :(得分:0)

如果要在每个p元素之后添加显式回车符,则要转换内容,而不是xsl:copy-of select="eventContent">-将执行深度复制。将xsl:copy-of更改为xsl:apply-templates select="eventContent/*",以使每个p元素都将与您定义为匹配p的模板相匹配(顺便说一下,匹配模式{{ 1}}就足够了,不必p):

//p

由于其他大部分内容都已保留,因此您可以使用修改后的identity transform并避免在XSLT中重复很多XML结构,而不是在根节点的模板中复制大部分内容。 / p>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml"  indent="yes"/>
    <xsl:template match="/"> 
        <Root>  
            <xsl:for-each select="eventlist">
                <eventlist>
                    <xsl:for-each select="event">
                        <event>
                            <eventTime><xsl:value-of select="eventTime"/></eventTime>
                            <eventTitle><xsl:value-of select="eventTitle"/></eventTitle>
                            <eventContent><xsl:apply-templates select="eventContent/*"/></eventContent>
                        </event>
                    </xsl:for-each>
                </eventlist>
            </xsl:for-each> 
        </Root>
    </xsl:template>

    <xsl:template match="p">
        <xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
        <xsl:text>&#13;</xsl:text> 
    </xsl:template>

</xsl:stylesheet>