我有xml元素类型的boleean。
<testelement>0</testelement>我使用xslt根据0/1值将值转换为no/yes,效果很好
<xsl:choose>
<xsl:when test="./text()='0'">
<xsl:text>No</xsl:text>
</xsl:when>
<xsl:when test="./text()='1'">
<xsl:text>Yes</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:message terminate="yes">The Yes/No value to be translated did not match expected input</xsl:message>
</xsl:otherwise>
</xsl:choose>我尝试对属性类型boolean执行相同的操作。元素具有未绑定的maxOcc。
<element attribute="0">
...
</element>
<element attribute="1">
...
</element>在xlts中:
<xsl:choose>
<xsl:when test="//@attribute='0'">
<xsl:text>No</xsl:text>
</xsl:when>
<xsl:when test="//@attribute='1'">
<xsl:text>Yes</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:message terminate="no">The Yes/No value to be translated did not match expected input</xsl:message>
</xsl:otherwise>
</xsl:choose>但是在我使用这段代码之后,所有的值都是Yes,或者所有的值都是No,这取决于第一个节点元素中的值是什么。例如,如果0在第一个元素中,所有的值都是No,而第二个元素中的值是1,这无关紧要。如何正确地转换它?谢谢
发布于 2018-12-01 00:05:32
这里有一个更好的方法:
<xsl:template match="node()[.='0'] | @*[.='0']" mode="toYesNo"/>No</xsl:template>
<xsl:template match="node()[.='1'] | @*[.='1']" mode="toYesNo"/>Yes</xsl:template>
<xsl:template match="node()|@*" mode="toYesNo"/>
<xsl:message terminate="no">The Yes/No value to be translated did not match expected input</xsl:message>
</xsl:template>然后,您可以使用xsl:apply-templates (使用mode="toYesNo")选择任何元素、属性或文本节点,以获得适当的转换。
在XSLT3.0中,您可以用m替换模式,例如,match=".[.='0']"来匹配任何类型的节点。
尽量避免使用./text(),因为当XML中有注释时,它就会出错。您几乎总是可以将其替换为.。
当然,您错误的属性是领先的//。您需要非常清楚绝对路径表达式(以/开头并从树根中选择)和相对路径表达式(从当前处理的节点中选择)之间的区别。
https://stackoverflow.com/questions/53558072
复制相似问题