【问题标题】:Separate the contents of a xml node with xsl用 xsl 分隔 xml 节点的内容
【发布时间】:2020-02-12 04:32:33
【问题描述】:

我正在使用 xsl 修改我的 xml 文档,但无法分离节点的内容。这是一个例子:

输入 XML 文档

<root>
  <exampleNode>text 1 <insideNodeA/> text 2 <insideNodeB/> text 3</exampleNode>
  <exampleNode>text 4<insideNodeB/></exampleNode>
</root>

简而言之,我有一个节点,其中可以包含一些文本,以及以任何顺序排列的各种不同节点(或无节点)。没有办法事先知道内容是否只有文本,文本和节点之一,只有节点之一,文本和两个节点以任意顺序等。

这是我需要的:

需要的 XML 输出

<root>
 <unwrapped>
   <txt>text 1</txt>
   <reworkedNodeA/>
   <txt>text 2</txt>
   <reworkedNodeB/>
   <txt>text 3</txt>
 </unwrapped>
 <unwrapped>
   <txt>text 4</txt>
   <reworkedNodeB/>
 </unwrapped>
</root>

当然,我正在改造 insideNodeA 和 B。

我的 XSL 代码

<xsl:template match="exampleNodee">
  <xsl:if test="count(*)&gt;0">
     <xsl:element name="unwrapped">
        <xsl:element name="txt"><xsl:value-of select="text()"/></xsl:element>
        <xsl:apply-templates select="child::node()"/>
     </xsl:element>
  </xsl:if>
</xsl:template>

问题是这段代码只用“exampleNode”的第一个文本创建了一个“txt”元素,然后为每个子节点应用模板。

如何以正确的顺序检索“exampleNode”的内容并应用正确的模板来获得想要的输出?

【问题讨论】:

    标签: xml xslt xpath


    【解决方案1】:

    好的,我确实找到了问题的答案,毕竟这很简单。

    所以我所要做的就是创建一个匹配“text()”的模板,然后更改我的 exampleNode 模板:

    <xsl:element name="unwrapped">
      <xsl:apply-templates select="text() | node()"/>
    </xsl:element>
    

    【讨论】:

    • 使用&lt;xsl:apply-templates/&gt; 就足够了,因为它是&lt;xsl:apply-templates select="node()"/&gt; 的缩写形式,并且任何“文本”节点都由node() 选择。
    • XSLT 允许您使用文字结果元素,例如&lt;unwrapped&gt;&lt;xsl:apply-templates/&gt;&lt;/unwrapped&gt;xsl:element 的使用主要用于在运行时计算结果元素的名称或命名空间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多