xml - XSLT:将元素名称作为字符串传递并将其转换为 XPATH 表达式
问题描述
XSLT 3.0 是否可以将字符串转换为 XPATH-query 中的元素名称?我想将元素的名称作为字符串传递给模板,然后将元素的名称包含在 XPATH 表达式中。像这样<xsl:variable name="el-name" select="'p'"/><xsl:copy-of select="$el-name"/>
的东西el-name
不再是字符串,而是选择元素 p。假设我有一个这样的源文档:
<?xml version="1.0" encoding="UTF-8"?>
<text xmlns="">
<list xml:id="p-1">
<item n="1"/>
<item n="2"/>
</list>
<head>This is a heading</head>
<p xml:id="p-1">Lorem ipsum</p>
<p xml:id="p-2">dolorosum</p>
</text>
和这样的样式表:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xpath-default-namespace="" exclude-result-prefixes="xs" xmlns="">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/text">
<selection-of-text xmlns="">
<xsl:call-template name="get-elements">
<xsl:with-param name="element-name" as="xs:string" select="'list'"/>
</xsl:call-template>
<xsl:call-template name="get-elements">
<xsl:with-param name="element-name" as="xs:string" select="'p'"/>
</xsl:call-template>
</selection-of-text>
</xsl:template>
<xsl:template name="get-elements">
<xsl:param name="element-name"/>
<xsl:choose>
<xsl:when test="$element-name = 'list'">
<xsl:copy-of select="list"/>
</xsl:when>
<xsl:when test="$element-name = 'p'">
<xsl:copy-of select="p"/>
</xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
在 BASH 我跑
java -cp "/mnt/c/Tools/SaxonHE9-9-1-4J/saxon9he.jar" net.sf.saxon.Transform \
-s:source.xml -xsl:stylesheet.xslt -o:output.xml
并获得所需的输出:
<?xml version="1.0" encoding="UTF-8"?>
<selection-of-text>
<list xml:id="p-1">
<item n="1"/>
<item n="2"/>
</list>
<p xml:id="p-1">Lorem ipsum</p>
<p xml:id="p-2">dolorosum</p>
</selection-of-text>
我的代码有效,但很笨拙。我想xsl:evaluate
可能可以动态构造正确的 XPATH 表达式,但我不知道如何。https://www.w3.org/TR/xslt-30/#evaluate-effect
解决方案
正如 Martin Honnen 上面所解释的那样,一个简单而简短的解决方案是:
<xsl:template name="get-elements">
<xsl:param name="element-name"/>
<xsl:copy-of select="*[name() = $element-name]"/>
</xsl:template>
我用 Saxon PE 9.9.1.4 测试的另一种解决方案是:
<xsl:template name="get-elements">
<xsl:param name="element-name"/>
<xsl:variable name = "els">
<xsl:evaluate xpath="$element-name" context-item="."/>
</xsl:variable>
<xsl:copy-of select="$els"/>
</xsl:template>
推荐阅读
- javascript - 自定义 URL 的 Javascript 正则表达式?
- java - Java JList 不显示元素
- python - Python:遍历两个列表,如果满足条件,则添加到它们,但每次都遍历列表的每个元素
- oracle - 创建没有参数的过程
- c# - 在 .netcore 2.1 中测试和运行
- .htaccess - 重定向移动设备的特定网址
- python-3.x - 已安装但 ModuleNotFoundError: No module named 'sklearn'
- vb.net - 如何通过 vb.net 从 dll 中调用 textbox.text
- python - Groupby 和仅选定的列
- jackson - 更新双向关系中的实体会导致循环错误