xslt - 使用 XSLT 2.0 将多个属性的值解析为类似数组的结构

标签 xslt xslt-2.0

我希望能够选择文档中某种类型的所有属性(例如,//@arch),然后获取该节点集并将值解析为第二个节点集。当我说“解析”时,具体来说我的意思是我想像这样转换一个节点集:

arch="value1;value2;value3"
arch="value1:value4"

进入这样的节点集:
arch="value1"
arch="value2"
arch="value3"
arch="value1"
arch="value4"

或类似的东西;我想将各个值从属性中取出并放入它们自己的节点中。

如果我可以让它达到那个状态,我有很多排序和重复删除的方法,之后我将使用完成的节点集进行发布任务。

我并不是在这里寻找一个整洁的答案作为一种方法。我知道 XSLT 不能做动态数组,但这与不能做诸如动态数组之类的事情或模仿功能的重要部分的事情不同。

我想到的一个想法是,我可以计算第一个节点集中的节点和分隔符的数量,计算第二个节点集需要的条目数并创建它(以某种方式),并使用子字符串函数将第一个节点集解析为第二个节点集。

通常有一种方法可以解决 XSLT 的问题;有没有人解决过这个问题?

谢谢你的帮助,
杰夫。

最佳答案

您可以使用 tokenize for 中的函数表达式以获取一系列单独的值,然后为每个值创建一个属性节点。但是,由于 XSLT 不允许您创建没有元素父元素的裸属性节点,因此您必须使用如下技巧:

<xsl:variable name="archElements">
  <xsl:for-each select="for $attr in $initialNodeSet
                        return tokenize($attr, '[:;]')">
    <dummy arch="{.}" />
  </xsl:for-each>
</xsl:variable>

然后 $archElements/dummy/@arch应该是分离的集合arch您需要的属性节点。

完整示例:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

  <xsl:output indent="yes" />

  <xsl:template match="/">
    <xsl:variable name="inputData">
      <a arch="value1;value2;value3" />
      <a arch="value1:value4" />
    </xsl:variable>

    <!-- create an example node set containing the two arch attribute nodes -->
    <xsl:variable name="initialNodeSet" select="$inputData/a/@arch" />

    <!-- tokenize and generate one arch attribute node for each value -->
    <xsl:variable name="archElements">
      <xsl:for-each select="for $attr in $initialNodeSet
                            return tokenize($attr, '[:;]')">
        <dummy arch="{.}" />
      </xsl:for-each>
    </xsl:variable>

    <!-- output to verify -->
    <r>
      <xsl:for-each select="$archElements/dummy/@arch">
        <c><xsl:copy-of select="."/></c>
      </xsl:for-each>
    </r>
  </xsl:template>
</xsl:stylesheet>

当运行任何输入文档(内容被忽略)时,这会产生
<?xml version="1.0" encoding="UTF-8"?>
<r>
   <c arch="value1"/>
   <c arch="value2"/>
   <c arch="value3"/>
   <c arch="value1"/>
   <c arch="value4"/>
</r>

关于xslt - 使用 XSLT 2.0 将多个属性的值解析为类似数组的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18339114/

相关文章:

xslt - 寻求有关使用 XSLT 转换 XML 内容的建议

java - XSL - 匹配节点的文本并附加另一个节点作为同级节点

xml - 选择在XSLT中逗号分隔的特定字符串

xml - 如何正确使用xsl :group-start-with with following siblings

.net - 如何在 .NET 中使用 XSLT?

xml - 使用 XSLT 更改 XML 文件中的一个标签名称

java - 如何从 XSD 和规则驱动 XML 生成?

xml - 使用 XSLT 检索 XML 文件名

xml - 如何使用xsl 2.0函数

xslt - 使用 xslt 替换功能将单词替换为元素