【发布时间】:2021-10-03 16:27:45
【问题描述】:
<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 函数,但它没有按我预期的方式工作。
使用类似 sn-p 的代码:
<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 很陌生,因此不胜感激。无论是如何以更有效的方式设计上述映射,还是如何以这种方式使用评估函数,我都可以获得单独的描述。 有关信息,目前正在使用带有 Java 的 Saxon XSL HE 10.5。
【问题讨论】:
-
如果您需要带有
xsl:evaluate的变量,也许可以将正确的as="item()*"放在您的xsl:variable上。对于整个问题,重现事物的最小但完整的样本会有所帮助。 -
这些答案有帮助吗?