选择字段元素时不确定 XSLT 文档中的当前路径

Posted

技术标签:

【中文标题】选择字段元素时不确定 XSLT 文档中的当前路径【英文标题】:Unsure about current path in XSLT document when selecting field element 【发布时间】:2018-08-21 10:43:41 【问题描述】:

我正在使用基于标头中的子类型的映射来转换 XML 文件。

为了实现这个逻辑,我在与根节点匹配的模板中使用了 xsl:if。

<xsl:template match="/">
  <xsl:variable name="var:invoiceSubtype" select="//Header/InvoiceType/text()"></xsl:variable>
  <xsl:if test="$var:invoiceSubtype = 'Invoice'">

在 xsl 内部:如果我粘贴了地图的 XSLT 代码,没有更改 xpath,但我的一些元素没有显示任何数据,比如这个:

<BELNR>
   <xsl:value-of select="/Header/InvoiceNumber/text()" />
</BELNR>

在 InvoiceType 之前,我的架构结构如下所示:

使用双斜杠选择元素是可行的,但我宁愿避免使用它,因为可能存在重复的命名元素。

在选择节点时,有没有办法显示您当前在源架构中的位置?我不确定正确的路径是什么。

【问题讨论】:

给新人的建议:如果一个答案解决了您的问题,请点击旁边的大复选标记 (✓) 接受它,也可以选择投票(投票至少需要 15 声望)点)。如果您发现其他答案有帮助,请给他们投票。接受和投票有助于未来的读者。请看【相关帮助中心文章】[1] [1]:***.com/help/someone-answers 【参考方案1】:

您可以从根目录开始更改为完整的XPATH,以避免使用//Header/InvoiceType/text(),而是使用:/CDM_PurchaseInvoice/Header/InvoiceType/text()

此外,如果您使用命名空间,您应该在 xpath 中考虑到它,或者使用语法 /x:List/x:Fields/x:Fiels/*[name()='List']/*[name()='Fields']/*[name()='Field'] 否则即使 xpath 乍一看看起来正确,您最终也可能不会提取任何内容。

见:Xml Namespace breaking my xpath!

【讨论】:

使用完整的 XPATH 不起作用,没有数据显示。 会不会是命名空间问题? @Leth: 你能提供xml文件吗? @Leth:很有可能是命名空间问题 @Leth:在此链接尝试解决方案 ***.com/questions/5239685/… /x:List/x:Fields/x:Fiels/*[name()='List']/*[name()='Fields']/*[name()='Field'] 让我知道它是否适合您

以上是关于选择字段元素时不确定 XSLT 文档中的当前路径的主要内容,如果未能解决你的问题,请参考以下文章

XSLT:测试当前元素是不是匹配变量 xpath

维护嵌套元素的分组方法 XSLT 2.0 - 分离多余的

使用 XSLT 删除 XML 消息中的空元素字段和默认值

如何将 xslt 中的参数用作 XPath?

如何通过匹配xslt中的id来确定元素的级别?

当输入文件上的字段为空时,XSLT 2.0 如何跳过写入元素