0

我正在尝试用“-”翻译空白。数据来自TEI-XML数据:

<m type="base"> 
  <m type="baseForm">A<c type="infix">B</c>CD</m> 
 </m>

XSL文件:

<?xml version="1.0" encoding="UTF-8"?>

  <xsl:for-each select="descendant::m[@type='base']/m[@type='baseForm']">  
    <xsl:choose>
      <xsl:when test="current()/c"><xsl:value-of select="current()[not != c[@type['infix']]] |node()"/></xsl:when>
     <xsl:otherwise><xsl:value-of select="current()"/></xsl:otherwise>
    </xsl:choose>
    <!-- my attempt -->
    <xsl:value-of select="translate(., ' ','-')"/>
   </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

按照这篇文章XSL replace space with caret的回答,我已经使用过translate,但它不起作用。结果应该是:“AB-CD”,但我有“AB CD”。

谢谢你的帮助。

4

2 回答 2

2

正如我可以预测的那样,空格的问题将是当 XML 如下所示时:

<?xml version="1.0" encoding="UTF-8"?>
<m type="base"> 
  <m type="baseForm">
      A
      <c type="infix">
          B
      </c>
      CD
  </m> 
 </m>

在这种情况下,您的逻辑可以放入内部variable然后执行translate功能,请参阅下面的 XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" />
    <xsl:template match="/">
        <!--put your logic in variable-->
        <xsl:variable name="str">
            <xsl:for-each select="descendant::m[@type='base']/m[@type='baseForm']">
                <xsl:value-of select="."/>
            </xsl:for-each>
        </xsl:variable>
    <!--normalize space will prevent spaces from left and right of string, then all spaces inside will be replaced by '-' -->
    <xsl:value-of select="translate(normalize-space($str), ' ', '-')"/>
 </xsl:template>
</xsl:stylesheet>

结果将如预期:

A-B-CD
于 2017-12-17T21:29:47.377 回答
0

我们也可以使用模板替换并且只翻译一次:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="text()" priority="2">
    <xsl:value-of select="translate(., &quot; &quot;, &quot;,&quot;)" />
  </xsl:template>
  <xsl:template match="/">
        <xsl:element name="Your1stNode">
          <xsl:apply-templates select="Your1stNode/text()" />
        </xsl:element>
        <xsl:element name="Your2ndNode">
          <xsl:apply-templates select="Your2ndNode/text()" />
        </xsl:element>
   </xsl:template>
</xsl:stylesheet>

您可以在整个文档中使用 text() 将所有空格替换为逗号。

于 2017-12-18T12:03:40.080 回答