1

在问题之后- 从节点 XSLT 中删除所有 \n\r 字符?看起来可以解决,我正在使用这个解决方案,但偶然发现了这种情况 -

如果我们不希望在所有节点中替换换行符怎么办。例如,如果用户在网页上输入新行,则某些节点(如描述、说明)旨在存储新行。

<T>
    <Name>Translate test</Name>
    <AlternateId>testid1</AlternateId>
    <Description>Translate test</Description>
    <Instructions>there is a new line between line1 and line2
    line1-asdfghjkl
    line2-asdfghjkl</Instructions>
    <Active>1</Active>
</T>

使用 translate(.,' ','') 后,xml 如下所示:

<T>
    <Name>Translate test</Name>
    <AlternateId>testid1</AlternateId>
    <Description>Translate test</Description>
    <Instructions>there is a new line between line1 and line2line1-asdfghjklline2-asdfghjkl</Instructions>
    <Active>1</Active>
</T>

我有超过 100 个这样的标签,我不想被翻译。有没有办法忽略这些不需要的标签的翻译?任何及时的帮助将不胜感激。

问候, Ashish K

4

2 回答 2

0

通常这样的任务是通过从复制节点不变的模板开始来解决的

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

现在您可以添加模板来转换您想要的元素,例如

<xsl:template match="Description | Instructions">
  <xsl:copy>
    <xsl:value-of select="translate(., '&#10;', '')"/>
  </xsl:copy>
</xsl:template>

当然,您需要在属性中列出要转换的所有元素名称,match但不必拼出不想转换的元素的名称。

于 2013-07-16T13:44:59.213 回答
0

您可以过滤匹配属性中的元素

<xsl:template match="*[name() = 'Instructions']/text()">
    <xsl:value-of select="translate(.,'&#xA;','')"/>
</xsl:template>

这意味着类似于“仅在指令元素中替换换行符”。

编辑:

您可以制作一个包含用于替换的元素名称的外部帮助 xml 文件。

<?xml version="1.0" encoding="UTF-8"?>
<Replace>
    <Description />
    <Instructions />
</Replace>

document()通过函数将其加载到变量中

<xsl:variable name="elementsForReplacing" select="document('replaceNames.xml')/Replace/*" />

然后只需检查此变量中是否存在以决定是否应该进行替换。

<xsl:template match="text()">
    <xsl:variable name="elementName" select="name(..)" />
    <xsl:choose>
        <xsl:when test="$elementsForReplacing[name() = $elementName]">
            <xsl:value-of select="translate(.,'&#xA;','')"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="." />
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>
于 2013-07-16T09:59:19.780 回答