如何在XSLT中的相应when语句中引用XML的ID字段中传递的值?
XML片段:
<UserArea>
<Id idOwner="Timekeeper">
<IdValue>Time</IdValue>
</Id>
</UserArea>
我想基于传递的IdValue构建条件语句(使用Choose Statement)。 我构建的所有内容似乎都没有识别我为When语句构建的条件语句。我尝试了几种不同的语法,但似乎没有任何工作,但是,我没有得到语法错误 - 它似乎永远不会进入节点并将其评估为True。我最新的是:
<xsl:when test="hr:Timekeeper = 'Time'">
我也不确定“hr”在本声明中是什么意思..我从前一个处理过这个XSLT的人那里复制了它。
我的所有IF语句都有效,但不是上述WHEN语句。在同一个XSLT中完美运行的示例IF语句是:
<xsl:if test="@idOwner = 'Timekeeper' and hr:IdValue !=''">
....do something
</xsl:if>
在这种语法中,属性的'@'标准是否正确?
我是构建XSLT的新手,我主要只需要对现有的XSLT进行非常小的编辑,但这是我必须做的第一个,而不仅仅是小编辑。
thxs!
答案 0 :(得分:3)
XSLT使用一种名为XPath的查询语法,因此我建议您阅读XPath,以便完全了解其工作原理。
在XPath中,您使用@
前缀来表示属性,因此以下内容应该有效:
<xsl:when test="@idOwner = 'Timekeeper'">
这将测试当前节点的idOwner
属性是否等于Timekeeper
。
答案 1 :(得分:1)
hr:是一个您不需要它的名称空间 除了ColinE的答案之外,节点的内容是textnode,因此你的测试语句应如下所示:
<xsl:when test="@idOwner = 'Timekeeper' and IdValue/text() != ''>
答案 2 :(得分:1)
XPath表达式依赖前缀来表示命名空间元素。未加前缀的名称始终引用无命名空间中的元素。我怀疑你的输入XML有一个默认的名称空间声明,如
xmlns="http://ns.hr-xml.org"
将所有元素放在命名空间中。因此,您的XSLT在xsl:stylesheet
上有一个匹配的声明,用于将相同的名称空间URI绑定到前缀
xmlns:hr="http://ns.hr-xml.org"
因此您可以在xpath中使用hr:IdValue
来选择IdValue
命名空间中的http://ns.hr-xml.org
元素。
xmlns="..."
不适用于属性,这就是您不需要为idOwner
属性名称添加前缀的原因。
您需要使用的确切表达式取决于当前上下文。如果您处于当前节点为Id
元素的上下文中(例如直接位于<xsl:template match="hr:Id">
内)并且您想要测试idOwner的值,则使用
test="@idOwner = 'Timekeeper'"
对于IdValue
test="hr:IdValue = 'Time'"
并且两者一起使用and
test="@idOwner = 'Timekeeper' and hr:IdValue = 'Time'"
如果当前上下文是父UserArea元素,并且您想要检查是否匹配这些约束的Id,那么您将使用
test="hr:Id[@idOwner = 'Timekeeper' and hr:IdValue = 'Time']"
答案 3 :(得分:0)
不确定是否有人甚至不再查看此帖子,但我最终必须在XSLT中构建一个函数来引用我需要解决的条件。我有几个高级人员和我一起工作(编码远远超过我自己),他们也无法让我们的选择声明起作用。它通过放弃我们的原始计划并在XSLT中构建函数调用来确定应该填充节点的名称来解决。