1

如何在 XSLT 中的相应 when 语句中引用 XML 的 ID 字段中传递的值?

XML 片段:

<UserArea>
  <Id idOwner="Timekeeper"> 
      <IdValue>Time</IdValue> 
  </Id> 
</UserArea>

我想根据传递的 IdValue 构建一个条件语句(使用选择语句)。我构建的所有内容似乎都无法识别我为 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 进行非常小的编辑,但这是第一个我要做的不仅仅是小编辑。

谢谢!

4

4 回答 4

3

XSLT 使用一种称为 XPath 的查询语法,因此我建议阅读 XPath,以便完全理解它是如何工作的。

在 XPath 中,您使用@前缀来表示属性,因此以下应该可以工作:

<xsl:when test="@idOwner = 'Timekeeper'">

这将测试当前节点的idOwner属性是否等于Timekeeper

于 2013-10-17T06:00:27.060 回答
1

hr: 是一个命名空间,除了 ColinE 的答案之外,示例中不需要它节点的内容是文本节点,因此您的测试语句应如下所示:

<xsl:when test="@idOwner = 'Timekeeper' and IdValue/text() != ''>
于 2013-10-17T06:25:36.277 回答
1

XPath 表达式依赖前缀来表示命名空间元素。无前缀名称总是指没有命名空间中的元素。我怀疑你的输入 XML 有一个默认的命名空间声明,比如

xmlns="http://ns.hr-xml.org"

它将所有元素放在一个命名空间中。所以你的 XSLT 有一个匹配的声明xsl:stylesheet来将相同的命名空间 URI 绑定到一个前缀

xmlns:hr="http://ns.hr-xml.org"

因此您可以hr:IdValue在 xpath 中使用来选择命名空间IdValue中的元素http://ns.hr-xml.org

Anxmlns="..."不适用于属性,这就是您不需要为idOwner属性名称添加前缀的原因。

您需要使用的确切表达式取决于当前上下文。如果您处于当前节点是Id元素的上下文中(例如直接在 an 内<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']"
于 2013-10-17T07:04:19.530 回答
0

不确定是否有人甚至不再查看这篇文章,但我最终不得不在 XSLT 中构建一个函数来引用我需要解决的条件。我有几个高级人员和我一起工作(编码时间比我长得多),他们也无法让我们的选择声明起作用。通过放弃我们最初的计划并在 XSLT 中构建一个函数调用来确定应该填充节点的名称来解决这个问题。

于 2013-10-22T02:33:58.463 回答