我继承了一些我正在努力解决的XSL。
源XML:
<as:article xmlns:as="http://www.example.com/schemas/articleschema">
<as:parastyles>
<as:parastyle name="Body ragged" uid="298" />
<as:parastyle name="Head 1col w rule" uid="304" />
<as:parastyle name="Headline Light" uid="312" />
</as:parastyles>
<as:charstyles>
<as:charstyle name="[None]" uid="112" />
<as:charstyle name="Character Style 1" uid="289" />
</as:charstyles>
<as:story name="body">
<as:runs>
<as:run p="298" c="112">
<as:eol />Lorem ipsum dolor sit amet, consectetur adipiscing elit. <as:eol />(Aug. 11) ut eros ut elit sollicitudin posuere <as:eol />Aenean maximus sed est vel rhoncus. Aenean sagittis scelerisque erat eu lacinia. Vivamus dignissim sapien ac magna egestas ultricies. Nullam viverra pulvinar diam a hendrerit. Vivamus blandit arcu eget nisl hendrerit, ac bibendum ex suscipit. In id imperdiet velit. In suscipit sodales dapibus. Nullam quis tellus ut ante fringilla pulvinar. Sed congue purus et velit tincidunt, et viverra leo vestibulum.<2028><as:eol /><2028><as:eol />Vestibulum consequat augue ac euismod sagittis. Pellentesque ex odio, iaculis laoreet tortor eu, maximus aliquam turpis. Quisque placerat, tortor id sodales venenatis, arcu tellus <as:eol />(commodo felis, sed finibus metus justo eget turpis. Vivamus mattis lorem sit amet porta sagittis. Pellentesque tristique nibh ex, in dapibus urna consequat at. Aenean tellus tellus, venenatis ut sagittis vel, porttitor ut neque. Vivamus at dui sed lectus <as:eol />(ultricies elementum. Aliquam libero quam, <as:eol />(mollis eget eleifend vel, suscipit ac libero. Praesent sit amet libero finibus, varius eros vitae, vulputate ipsum. Morbi a purus orci. Nunc pulvinar fringilla eros a pharetra. Aenean in pellentesque nisi, et pretium diam.<2029></as:run>
<as:run p="298" c="112" b="true">
<as:eol />John Smith<2029></as:run>
<as:run p="298" c="112" i="true">Townville</as:run>
<as:run p="298" c="112">
<as:eol /><2029></as:run>
</as:runs>
</as:story>
<as:story name="head">
<as:runs>
<as:run p="312" c="289">Lorem Ipsum</as:run>
</as:runs>
</as:story>
<as:story name="column">
<as:runs>
<as:run p="304" c="112">LETTER</as:run>
</as:runs>
</as:story>
</as:article>
继承的XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:as="http://www.example.com/schemas/articleschema">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:apply-templates select="//as:story[@name='body']"/>
</xsl:template>
<xsl:template match="as:run[@i]">
<xsl:text><em></xsl:text><xsl:value-of select="."/><xsl:text></em></xsl:text>
</xsl:template>
<xsl:template match="as:run[@b]">
<xsl:text> <strong></xsl:text><xsl:value-of select="."/><xsl:text></strong> </xsl:text>
</xsl:template>
<xsl:template match="as:run[@p=/article/parastyles/parastyle[@name='Head babies-recipe']/@uid]">
<xsl:text> <strong></xsl:text><xsl:value-of select="."/><xsl:text></strong> </xsl:text>
</xsl:template>
<xsl:template match="as:run[@p=/article/parastyles/parastyle[@name='2head']/@uid]">
<xsl:text> <strong></xsl:text><xsl:value-of select="."/><xsl:text></strong> </xsl:text>
</xsl:template>
<xsl:template match="as:run[@p=/article/parastyles/parastyle[@name='Head subhead14']/@uid]">
<xsl:text> <strong></xsl:text><xsl:value-of select="."/><xsl:text></strong> </xsl:text>
</xsl:template>
<xsl:template match="as:eol[@hyphenated]">
<xsl:text></xsl:text>
</xsl:template>
<xsl:template match="as:eol">
<xsl:text></xsl:text>
</xsl:template>
<xsl:variable name="fp2029">
<xsl:call-template name="string-replace-all-2029">
<xsl:with-param name="text2029" select="//as:story[@name='body']" />
<xsl:with-param name="replace2029" select="'<2029>'" />
<xsl:with-param name="by2029" select="'
'" />
</xsl:call-template>
</xsl:variable>
<xsl:template match="/">
<xsl:value-of select="//as:story[@name='body']"/>
</xsl:template>
<xsl:template name="string-replace-all-2029">
<xsl:param name="text2029" />
<xsl:param name="replace2029" />
<xsl:param name="by2029" />
<xsl:choose>
<xsl:when test="contains($text2029, $replace2029)">
<xsl:value-of select="substring-before($text2029,$replace2029)"/>
<xsl:value-of select="$by2029" />
<xsl:call-template name="string-replace-all-2029">
<xsl:with-param name="text2029"
select="substring-after($text2029,$replace2029)"/>
<xsl:with-param name="replace2029" select="$replace2029"/>
<xsl:with-param name="by2029" select="$by2029"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text2029" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:variable name="fp2028">
<xsl:call-template name="string-replace-all-2028">
<xsl:with-param name="text2028" select="$fp2029" />
<xsl:with-param name="replace2028" select="'<2028>'" />
<xsl:with-param name="by2028" select="'
'" />
</xsl:call-template>
</xsl:variable>
<xsl:template match="/">
<xsl:value-of select="$fp2028"/>
</xsl:template>
<xsl:template name="string-replace-all-2028">
<xsl:param name="text2028" />
<xsl:param name="replace2028" />
<xsl:param name="by2028" />
<xsl:choose>
<xsl:when test="contains($text2028, $replace2028)">
<xsl:value-of select="substring-before($text2028,$replace2028)"/>
<xsl:value-of select="$by2028" />
<xsl:call-template name="string-replace-all-2028">
<xsl:with-param name="text2028"
select="substring-after($text2028,$replace2028)"/>
<xsl:with-param name="replace2028" select="$replace2028"/>
<xsl:with-param name="by2028" select="$by2028"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text2028" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
文档说XSL应该找到正文:
- 替换文本中任何指定的strong或em部分
- 查找并替换<2029>并且<2028>带换行符的字符串
我继承的XSL中似乎只有一个或另一个以上函数可以同时工作。要么我得到strong/em格式,要么行返回是固定的,这取决于我如何修改XSL。
有没有办法让两者都申请?
所需结果:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. (Aug. 11) ut eros ut elit sollicitudin posuere Aenean maximus sed est vel rhoncus. Aenean sagittis scelerisque erat eu lacinia. Vivamus dignissim sapien ac magna egestas ultricies. Nullam viverra pulvinar diam a hendrerit. Vivamus blandit arcu eget nisl hendrerit, ac bibendum ex suscipit. In id imperdiet velit. In suscipit sodales dapibus. Nullam quis tellus ut ante fringilla pulvinar. Sed congue purus et velit tincidunt, et viverra leo vestibulum.
Vestibulum consequat augue ac euismod sagittis. Pellentesque ex odio, iaculis laoreet tortor eu, maximus aliquam turpis. Quisque placerat, tortor id sodales venenatis, arcu tellus (commodo felis, sed finibus metus justo eget turpis. Vivamus mattis lorem sit amet porta sagittis. Pellentesque tristique nibh ex, in dapibus urna consequat at. Aenean tellus tellus, venenatis ut sagittis vel, porttitor ut neque. Vivamus at dui sed lectus (ultricies elementum. Aliquam libero quam, (mollis eget eleifend vel, suscipit ac libero. Praesent sit amet libero finibus, varius eros vitae, vulputate ipsum. Morbi a purus orci. Nunc pulvinar fringilla eros a pharetra. Aenean in pellentesque nisi, et pretium diam.
<strong>John Smith</strong>
<em>Townville</em>
我认为,如果对相同的元素执行两个单独的转换,最好的方法通常是运行由单独的样式表控制的两个转换的管道。
有时使用之类的东西在一个样式表中进行两个转换会更方便
<xsl:variable name="output-of-phase-1">
<xsl:apply-templates mode="phase-1"/>
</xsl:variable>
<xsl:apply-templates select="$output-of-phase-1" mode="phase-2"/>
这个"继承的";样式表,我不知道从哪里开始。只是我看到的一些事情的笔记。
有三种不同的模板用于匹配根文档节点。
第一:
<xsl:template match="/">
<xsl:apply-templates select="//as:story[@name='body']"/>
</xsl:template>
然后:
<xsl:template match="/">
<xsl:value-of select="//as:story[@name='body']"/>
</xsl:template>
最后:
<xsl:template match="/">
<xsl:value-of select="$fp2028"/>
</xsl:template>
由于这三个模板匹配相同的项目(根文档节点(并且它们没有分配优先级/"将被选中。这就是在这个继承的工作表中给出当前输出的原因。
根据您的描述和您想要的输出,您还需要至少执行以下两个模板:
<xsl:template match="as:run[@i]">
<xsl:text><em></xsl:text><xsl:value-of select="."/><xsl:text></em></xsl:text>
</xsl:template>
<xsl:template match="as:run[@b]">
<xsl:text> <strong></xsl:text><xsl:value-of select="."/><xsl:text></strong> </xsl:text>
</xsl:template>
但是,您当前的工作表将永远不会执行这些模板,因为它们从未从与根文档匹配的第三个模板中应用。
我试图通过在工作表中对中间变量执行连续操作来应用Kay博士上面描述的合理原则。我已经注释掉了一些死代码,但还没有完全删除。我相信这更接近您的预期输出,尽管不完全相同。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:as="http://www.example.com/schemas/articleschema">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:variable name="matchStrongAndEm">
<xsl:apply-templates select="//as:story[@name='body']"/>
</xsl:variable>
<xsl:variable name="replace2028">
<xsl:call-template name="string-replace-all-2028">
<xsl:with-param name="text2028" select="$matchStrongAndEm" />
<xsl:with-param name="replace2028" select="'<2028>'" />
<xsl:with-param name="by2028" select="'
'" />
</xsl:call-template>
</xsl:variable>
<xsl:call-template name="string-replace-all-2029">
<xsl:with-param name="text2029" select="$replace2028" />
<xsl:with-param name="replace2029" select="'<2029>'" />
<xsl:with-param name="by2029" select="'
'" />
</xsl:call-template>
</xsl:template>
<xsl:template match="//as:runs">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="as:run[@i]">
<xsl:text><em></xsl:text><xsl:value-of select="."/><xsl:text></em></xsl:text>
</xsl:template>
<xsl:template match="as:run[@b]">
<xsl:text> <strong></xsl:text><xsl:value-of select="."/><xsl:text></strong> </xsl:text>
</xsl:template>
<xsl:template match="as:run[@p=/article/parastyles/parastyle[@name='Head babies-recipe']/@uid]">
<xsl:text> <strong></xsl:text><xsl:value-of select="."/><xsl:text></strong> </xsl:text>
</xsl:template>
<xsl:template match="as:run[@p=/article/parastyles/parastyle[@name='2head']/@uid]">
<xsl:text> <strong></xsl:text><xsl:value-of select="."/><xsl:text></strong> </xsl:text>
</xsl:template>
<xsl:template match="as:run[@p=/article/parastyles/parastyle[@name='Head subhead14']/@uid]">
<xsl:text> <strong></xsl:text><xsl:value-of select="."/><xsl:text></strong> </xsl:text>
</xsl:template>
<xsl:template match="as:eol[@hyphenated]">
<xsl:text></xsl:text>
</xsl:template>
<xsl:template match="as:eol">
<xsl:text></xsl:text>
</xsl:template>
<!--
<xsl:variable name="fp2029">
<xsl:call-template name="string-replace-all-2029">
<xsl:with-param name="text2029" select="//as:story[@name='body']" />
<xsl:with-param name="replace2029" select="'<2029>'" />
<xsl:with-param name="by2029" select="'
'" />
</xsl:call-template>
</xsl:variable>
<xsl:template match="/">
<xsl:value-of select="//as:story[@name='body']"/>
</xsl:template>
-->
<xsl:template name="string-replace-all-2029">
<xsl:param name="text2029" />
<xsl:param name="replace2029" />
<xsl:param name="by2029" />
<xsl:choose>
<xsl:when test="contains($text2029, $replace2029)">
<xsl:value-of select="substring-before($text2029,$replace2029)"/>
<xsl:value-of select="$by2029" />
<xsl:call-template name="string-replace-all-2029">
<xsl:with-param name="text2029"
select="substring-after($text2029,$replace2029)"/>
<xsl:with-param name="replace2029" select="$replace2029"/>
<xsl:with-param name="by2029" select="$by2029"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text2029" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!--
<xsl:variable name="fp2028">
<xsl:call-template name="string-replace-all-2028">
<xsl:with-param name="text2028" select="$fp2029" />
<xsl:with-param name="replace2028" select="'<2028>'" />
<xsl:with-param name="by2028" select="'
'" />
</xsl:call-template>
</xsl:variable>
<xsl:template match="/">
<xsl:value-of select="$fp2028"/>
</xsl:template>
-->
<xsl:template name="string-replace-all-2028">
<xsl:param name="text2028" />
<xsl:param name="replace2028" />
<xsl:param name="by2028" />
<xsl:choose>
<xsl:when test="contains($text2028, $replace2028)">
<xsl:value-of select="substring-before($text2028,$replace2028)"/>
<xsl:value-of select="$by2028" />
<xsl:call-template name="string-replace-all-2028">
<xsl:with-param name="text2028"
select="substring-after($text2028,$replace2028)"/>
<xsl:with-param name="replace2028" select="$replace2028"/>
<xsl:with-param name="by2028" select="$by2028"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text2028" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
这给出了输出:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. (Aug. 11) ut eros ut elit sollicitudin posuere Aenean maximus sed est vel rhoncus. Aenean sagittis scelerisque erat eu lacinia. Vivamus dignissim sapien ac magna egestas ultricies. Nullam viverra pulvinar diam a hendrerit. Vivamus blandit arcu eget nisl hendrerit, ac bibendum ex suscipit. In id imperdiet velit. In suscipit sodales dapibus. Nullam quis tellus ut ante fringilla pulvinar. Sed congue purus et velit tincidunt, et viverra leo vestibulum.
Vestibulum consequat augue ac euismod sagittis. Pellentesque ex odio, iaculis laoreet tortor eu, maximus aliquam turpis. Quisque placerat, tortor id sodales venenatis, arcu tellus (commodo felis, sed finibus metus justo eget turpis. Vivamus mattis lorem sit amet porta sagittis. Pellentesque tristique nibh ex, in dapibus urna consequat at. Aenean tellus tellus, venenatis ut sagittis vel, porttitor ut neque. Vivamus at dui sed lectus (ultricies elementum. Aliquam libero quam, (mollis eget eleifend vel, suscipit ac libero. Praesent sit amet libero finibus, varius eros vitae, vulputate ipsum. Morbi a purus orci. Nunc pulvinar fringilla eros a pharetra. Aenean in pellentesque nisi, et pretium diam.
<strong>John Smith
</strong> <em>Townville</em>