首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >xml属性中的xslt

xml属性中的xslt
EN

Stack Overflow用户
提问于 2018-11-30 20:58:10
回答 2查看 31关注 0票数 0

我有xml元素类型的boleean。

代码语言:javascript
运行
复制
<testelement>0</testelement>

我使用xslt根据0/1值将值转换为no/yes,效果很好

代码语言:javascript
运行
复制
<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。

代码语言:javascript
运行
复制
<element attribute="0">
...
</element>
<element attribute="1">
...
</element>

在xlts中:

代码语言:javascript
运行
复制
<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,这无关紧要。如何正确地转换它?谢谢

EN

回答 2

Stack Overflow用户

发布于 2018-11-30 22:23:19

所有值均为是或所有值均为否,具体取决于第一个节点元素中的值

是的,他们当然是。这是因为你的测试:

代码语言:javascript
运行
复制
<xsl:when test="//@attribute='0'">

选择all XML文档中的所有属性,在XSLT1.0(我假设您正在使用它)中,将只使用第一个值。

您首先需要在element的上下文中,然后通过以下方法测试该特定元素的属性:

代码语言:javascript
运行
复制
<xsl:when test="@attribute='0'">
票数 0
EN

Stack Overflow用户

发布于 2018-12-01 00:05:32

这里有一个更好的方法:

代码语言:javascript
运行
复制
<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中有注释时,它就会出错。您几乎总是可以将其替换为.

当然,您错误的属性是领先的//。您需要非常清楚绝对路径表达式(以/开头并从树根中选择)和相对路径表达式(从当前处理的节点中选择)之间的区别。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53558072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档