1

我发现很多关于通过 XSLT 函数 translate(source, sourceChars, outputChars) 翻译特定元素/属性的内容,因此对于 translate("čašaž","čšž", "csz") = casaz

我需要 XSLT 模板,它可以翻译每个节点和每个属性。我不知道源 XML 的结构,所以它必须是通用的,不独立于属性或元素名称和值。

我正在寻找类似这种伪转换的东西:

  <xsl:template match="@*">
    <xsl:copy>
        <xsl:apply-templates select="translate( . , "čžš","czs")"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="node()">
    <xsl:copy>
      <xsl:apply-templates select="translate( . , "čžš","czs")"/>
    </xsl:copy>
  </xsl:template>
4

1 回答 1

2

您可以为那些包含要规范化的数据的元素编写模板,下面我为属性值、文本节点、注释节点和处理指令数据执行此操作。

<xsl:param name="in" select="'čžš'"/>
<xsl:param name="out" select="'czs'"/>

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

<xsl:template match="@*">
  <xsl:attribute name="{name()}" namespace="{namespace-uri()}">
    <xsl:value-of select="translate(., $in, $out)"/>
  </xsl:attribute>
</xsl:template>

<xsl:template match="text()">
  <xsl:value-of select="translate(., $in, $out)"/>
</xsl:template>

<xsl:template match="comment()">
  <xsl:comment>
    <xsl:value-of select="translate(., $in, $out)"/>
  </xsl:comment>
</xsl:template>

<xsl:template match="processing-instruction()">
  <xsl:processing-instruction name="{name()}">
    <xsl:value-of select="translate(., $in, $out)"/>
  </xsl:processing-instruction>
</xsl:template>
于 2013-10-18T17:43:59.123 回答