Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 使用不同的XSLT生成各种结果_Xml_Xslt_Replace - Fatal编程技术网

Xml 使用不同的XSLT生成各种结果

Xml 使用不同的XSLT生成各种结果,xml,xslt,replace,Xml,Xslt,Replace,我使用我的软件创建一个XML(也就是说,我可以控制它的结构)。我希望通过使用不同的XSLT翻译文件,使用此XML生成不同的结果。根据所使用的XSLT,如何在结果中生成不同的文本 更具体的: 我的结果文件应包含“点”字符,即。e或三个点,即。e…,具体取决于所使用的XSLT。对于一个XSLT,我的XML将导致第一个XSLT,对于另一个XSLT,相同的XML(!)将导致第二个XSLT。我需要编写XSLT,以便将XML一次转换为一个,一次转换为另一个 我的第一种方法是替换输入的子字符串。本主题还存在各

我使用我的软件创建一个XML(也就是说,我可以控制它的结构)。我希望通过使用不同的XSLT翻译文件,使用此XML生成不同的结果。根据所使用的XSLT,如何在结果中生成不同的文本

更具体的:

我的结果文件应包含“点”字符,即。e<代码>或三个点,即。e<代码>…,具体取决于所使用的XSLT。对于一个XSLT,我的XML将导致第一个XSLT,对于另一个XSLT,相同的XML(!)将导致第二个XSLT。我需要编写XSLT,以便将XML一次转换为一个,一次转换为另一个

我的第一种方法是替换输入的子字符串。本主题还存在各种其他问题,但到目前为止,没有一个适合我的情况:

  • 在XML中使用
    ,然后在XSLT中使用
    replace()
    ——但我使用的是XSLT 1.0,它不包含这个漂亮的函数
  • 在XML中使用
    ..
    ,然后在XSLT中使用
    translate()
    ——但这只能将一个字符转换为一个字符,而我需要将
    ..
    作为输出之一(即多个字符)
  • 在XML中使用实体(例如,
    &dots;
    ),并让XSLT将其扩展为不同的字符串——我发现唯一的方法是将实体与任何其他字符串完全一样处理,因此也没有找到解决方案。我仍然希望我没有用这种方法找到一个好的简单的解决方案
在XSLT1.0中实现类似于
replace()
的东西有很多艰难的解决方案。在使用这些之前,我宁愿创建不同的XML:-/


我感到惊讶的是,我的问题似乎很难解决,而且感觉我忽略了一些简单的东西。

XSLT,特别是1.0版,有一个更粗糙的焦点,比您希望的更简约。它是用来处理节点、它们的子节点和它们的值的工具,但其用于字符串操作的内置功能是有限的。如果您不准备使用扩展函数,那么这意味着您可能需要为某些事情编写自己的XSLT

例如,假设生成的XML包含一个省略字符。您的一个转换可以简单地按原样传递这些信息。你的另一半可能会使用这样的机制将它们转换为三个点:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="text()">
    <xsl:call-template name="translate-elipsis">
      <xsl:with-param name="text" select="."/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="translate-elipsis">
    <xsl:param name="text"/>
    <xsl:choose>
      <xsl:when test="contains($text,'…')">
        <xsl:value-of select="substring-before($text,'…')"/>
        <xsl:text>...</xsl:text>
        <xsl:call-template name="translate-elipsis" select="substring-after($text,'…')"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$text"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

</xsl:stylesheet>

...

转换没有更具体匹配的所有文本节点的内容;如果需要,也可以使用它来转换属性值。它当然比单个函数调用更详细,但我认为这并不离谱。您可以使用类似的模式编写字符串替换的通用模板。

我使用以下建议解决了FOP的问题: 在添加了一些名称空间后,我访问了一个
replaceAll()
,它可以正常工作,看起来:

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:fo="http://www.w3.org/1999/XSL/Format"
                xmlns:xalan="http://xml.apache.org/xalan"
                xmlns:str="xalan://java.lang.String">

后来:

  <xsl:template match="text()">
    <xsl:value-of select="str:replaceAll(str:new(.), '…', '...')"/>
  </xsl:template>


如果我在将来使用此工具时发现任何问题,我可能会更新我的答案。到目前为止,它似乎解决了我的任务。

正如您所说,您掌握着XML,似乎一种简单的方法就是在它自己的元素中标记特定的数据,例如

<p>This is a text with an <ellipsis/>.</p>
这是一个带有

然后在样式表中,你想要有三个点,你只需要有一个模板

<xsl:template match="ellipsis">
  <xsl:text>...</xsl:text>
</xsl:template>

...
其中,另一个样式表将输出字符

<xsl:template match="ellipsis">
  <xsl:text>…</xsl:text>
</xsl:template>

除此之外,我同意所提出的建议和评论,现在Java平台支持XSLT 2.0甚至3.0,没有人被迫在JRE中使用内置XSLT 1.0处理器的FOP。

结果中的字符串也是如此(即
..
..
)完全依赖于输入XML中的任何内容,还是仅仅依赖于使用的XSLT?如果需要一个XSLT输出一个字符串,另一个XSLT输出第二个字符串,那么如果在样式表代码中使用XSLT,我不明白为什么需要使用translate或replace。不同的转换以不同的方式转换相同的输入有什么了不起的地方?您打算在可以依赖的上下文中使用转换吗提供扩展功能?它不依赖于XML,不。XML声明“这里有一个省略号”(使用
..
&dots;
或其他任何形式),XSLT应该在输出中将其解释为
..
..
。你写的样式表让我很感兴趣。你有没有看到用另一种方法做这件事的方法?也许我的问题应该是“你将如何解决这项任务?如果不是通过XSLT,那是通过什么方式?”XSLT看起来很自然,因为我在这里使用XSL-FO来排版文档,PDF呈现程序(Apache FOP)允许命名XSLT以将XML转换为FO。@JohnBollinger对不起,我不明白你在第二次评论中问什么。关于第一点:我没有发现任何值得注意的地方。我发现值得注意的是,专门在XSLT中翻译文本似乎是一个问题。谢谢,这对我的口味来说已经足够清楚了,而且很有效,但奇怪的是,它删除了
和下一个单词之间的空格。我可以将它添加到
标记中,但当然省略号后面并不总是有空格。你知道为什么它会吞噬空间,以及如何修复它吗?等等,我发现不仅仅是一个空间丢失了。事实上,从省略号到下一个开头的标签都不见了。当然!这是一个我一直在寻找的简单解决方案:-)将在测试后接受。