微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

XSL 动态 XPath 评估

如何解决XSL 动态 XPath 评估

<name>
  <pattern>/Book/Title</pattern>
  <pattern>/Newspaper/Title</pattern>
</name>
<Description>
  <pattern>/Book/Descriptions/*</pattern>
  <pattern>/Newspaper/Descriptions/*<pattern>
</Description>

我有一系列不同的 XML 文件。给定一个像上面这样的 XML 文件,我想从所有这些文件提取语义相似的信息并以 JSON 格式显示它。例如。我可能想从 XML 编码书籍信息之一中提取名称和描述以接收如下文件

 "name": "Harry Potter","description": ["DescA","DescB"]

属于那个的 XML 文件可能看起来像:

<Book>
  <Title>Harry Potter</Title>
  <Author>J.K. Rowling </Author>
  <Description lang="de">DescA</Description>
  <Description lang="en">DescB</Description>
</Book>

我想过使用 XSL 3.0 来使用 xsl:evaluate 函数,但它没有按我预期的方式工作。

使用如下代码片段:

<xsl:variable name="pattern">
   <xsl:evaluate xpath="/Book/Descriptions/*" context-item="$root"/>
</xsl:variable>
<xsl:for-each select="$pattern">
    <xsl:value-of select="."/>
    <xsl:text>,</xsl:text>
</xsl:for-each>

我只将所有描述作为一个长连接字符串获取,而不是能够遍历它们。我本来期望输出像“DescA,DescB,”,但只得到“DescADescB,”。 我对 XSL 很不熟悉,所以任何帮助表示赞赏。无论是如何以更有效的方式设计上述映射,或者如何以这种方式使用评估函数,我都可以获得单独的描述。 有关信息,目前使用 Saxon XSL HE 10.5 和 Java。

解决方法

从简单的例子开始

  <xsl:template match="/">
    <xsl:value-of separator=",">
      <xsl:evaluate xpath="'Book/Description'" context-item="."/>
    </xsl:value-of>
  </xsl:template>

对于您的样本,

<Book>
  <Title>Harry Potter</Title>
  <Author>J.K. Rowling </Author>
  <Description lang="de">DescA</Description>
  <Description lang="en">DescB</Description>
</Book>

应该给 DescA,DescB

通过例如存储在 xsl:variable 元素内部构造的项目序列xsl:evaluate 作为项目序列而不是结果树的子节点是通过使用例如实现的xsl:variable as="item()*" ...,而不是通过更改您的 xsl:evaluate

,

我有点困惑,因为这里有两个 XML 文档,它们都包含与 Description 匹配的元素,但都没有与 Book/Descriptions/* 匹配的元素,一个包含模式要评估的(表达式)不包含 Book 元素。

也许您真正的错误被复制/粘贴错误掩盖了。您选择的变量名称 pattern 也暗示您可能会感到困惑:xsl:evaluate 的结果不是模式(甚至不是 XPath 表达式),而是一组节点。

一个明确的错误是您没有在变量上指定 as 属性(这意味着 xsl:evaluate 的结果被复制到新的文档树中)。我希望是这样的:

<xsl:variable name="selected-nodes" as="node()*">
   <xsl:evaluate xpath="//Description/pattern" context-item="$root"/>
</xsl:variable>

但我不确定这正是您想要的,因为 //Description/pattern 选择多个表达式,而 xsl:evaluate 只会计算一个。如果你想评估多个模式并组合结果,那是可以的,但我需要更清楚地了解需求。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。