我有一个xslt问题,我希望有人可以提供帮助。我在父级下面有一个子节点列表。这些注释中的某些注释在括号中或使用左括号中都有一个字母。这意味着该变体可以是" on"或者"一,"例如。
我想要做的是将它们分开,以便它们看起来像两个单独的元素,但我不太确定如何使用xslt。有可能吗?
下面是一个例子,让您了解我正在使用的内容。
<forms>
<variant>ane</variant>
<variant>on</variant>
<variant>o</variant>
<variant>ane</variant>
<variant>on(e</variant>
<variant>o</variant>
<variant>an(n)e</variant>
<variant>æn(n)e</variant>
<variant>en(n)e</variant>
<variant>en</variant>
<variant>ane</variant>
<variant>on(e</variant>
<variant>anne</variant>
<variant>æn(n)e</variant>
<variant>anre</variant>
<variant>are</variant>
<variant>hare</variant>
<variant>ore</variant>
<variant>anes</variant>
<variant>æn(n)es</variant>
<variant>en(n)es</variant>
</forms>
理想情况下,完成后会看起来像这样。
<forms>
<variant>ane</variant>
<variant>on</variant>
<variant>o</variant>
<variant>ane</variant>
<variant>on</variant>
<variant>one</variant>
<variant>o</variant>
<variant>anne</variant>
<variant>ane</variant>
<variant>ænne</variant>
<variant>æne</variant>
<variant>ene</variant>
<variant>enne</variant>
<variant>en</variant>
<variant>ane</variant>
<variant>on</variant>
<variant>one</variant>
<variant>anne</variant>
<variant>æne</variant>
<variant>ænne</variant>
<variant>anre</variant>
<variant>are</variant>
<variant>hare</variant>
<variant>ore</variant>
<variant>anes</variant>
<variant>ænnes</variant>
<variant>ænes</variant>
<variant>ennes</variant>
<variant>enes</variant>
</forms>
我可以很好地复制节点并在必要时抑制括号,但我不知道该怎么做是创建条件,当这些括号作为应用的一部分存在时,它将仅复制两次templates命令。
答案 0 :(得分:5)
这可以归结为一些简单的逻辑来检查<variant>
内容的字符串值,然后是一些简单的逻辑来扼杀字符串。
此处的示例代码也适用于XSLT 1.0。
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="forms">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="variant">
<xsl:choose>
<!-- Works in XSLT 1.0 -->
<xsl:when test="contains(., '(')">
<xsl:copy>
<!-- Enter the shorter value, minus anything in the parentheses -->
<xsl:value-of select="concat(substring-before(., '('), substring-after(., ')'))"/>
</xsl:copy>
<xsl:copy>
<!-- Enter the full value, only excluding the parentheses -->
<xsl:value-of select="translate(translate(., '(', ''), ')', '')"/>
</xsl:copy>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>