XSL:用连字符替换白色 space
XSL: replace white space by hyphen
我正在尝试将白色 space 翻译成“-”。
数据来自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>
根据这个postXSL replace space with caret的回答,我已经使用了translate
,但它不起作用。
结果应该是:"A-B-CD" 但我有 "A B CD."
感谢您的帮助。
正如我所预料的那样,当 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
我们也可以使用模板替换并且只翻译一次:
<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(., " ", ",")" />
</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() 将所有 space 替换为逗号。
我正在尝试将白色 space 翻译成“-”。
数据来自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>
根据这个postXSL replace space with caret的回答,我已经使用了translate
,但它不起作用。
结果应该是:"A-B-CD" 但我有 "A B CD."
感谢您的帮助。
正如我所预料的那样,当 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
我们也可以使用模板替换并且只翻译一次:
<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(., " ", ",")" />
</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() 将所有 space 替换为逗号。