从XSL中的命名空间节点获取子节点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从XSL中的命名空间节点获取子节点相关的知识,希望对你有一定的参考价值。

我需要获取c:batch节点的每个子节点。 <xsl:template match =“s-20”>与节点不匹配。我做错了什么?任何帮助赞赏。 Thanx很多提前。

<?xml version="1.0" encoding="UTF-8"?>
<c:batch xmlns:a="http://www.test.com/data/6/archive"
         xmlns:i="http://www.test.com/data/6/archive/import"
         xmlns="http://www.test.com/dos/asap"
         xmlns:n1="http://www.test.com/dos"
         xmlns:c="http://www.test.com/data/6/capture">
   <s-20 file="00000001.pdf" checked="true">
      <code>X12345</code>
      <type>data</type>
   </s-20>
   <s-20 file="00000002.pdf" checked="false">
      <code>X67890</code>
      <type>data</type>
   </s-20>
   <s-20 file="00000003.pdf" checked="true">
      <code>X87687</code>
      <type>data</type>
   </s-20>
</c:batch>

样式表:

<xsl:stylesheet version="1.0" 
         xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
         xmlns:a="http://www.test.com/data/6/archive"
         xmlns:i="http://www.test.com/data/6/archive/import"
         xmlns="http://www.test.com/dos/asap"
         xmlns:n1="http://www.test.com/dos"
         xmlns:c="http://www.test.com/data/6/capture">
         
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <xsl:element name="Documents">
      <xsl:value-of select="count(s-20)"/>
      <xsl:apply-templates />
    </xsl:element>
  </xsl:template>
  
  <xsl:template match="s-20">
    <xsl:value-of select="code"/>
  </xsl:template>
</xsl:stylesheet>
答案

你的<s-20>在命名空间中:

xmlns="http://www.test.com/dos/asap"

要匹配它们,请在XSLT中使用显式命名空间,例如:添加线

xmlns:t="http://www.test.com/dos/asap"

到你的XSLT中的<xsl:stylesheet>根元素,并用t:作为匹配规则的前缀。在xsl:copy-of模板中也使用xsl:value-of而不是s-20。然后将所有s-20元素复制到输出。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
         xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
         xmlns:a="http://www.test.com/data/6/archive"
         xmlns:i="http://www.test.com/data/6/archive/import"
         xmlns:t="http://www.test.com/dos/asap"
         xmlns:n1="http://www.test.com/dos"
         xmlns:c="http://www.test.com/data/6/capture">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/c:batch">
    <xsl:element name="Documents">
      <xsl:value-of select="count(t:s-20)"/>
      <xsl:apply-templates />
    </xsl:element>
  </xsl:template>

  <xsl:template match="t:s-20">
    <xsl:copy-of select="."/>
  </xsl:template>
</xsl:stylesheet>

输出:

<?xml version="1.0"?>
<Documents>3
  <s-20 xmlns:a="http://www.test.com/data/6/archive" xmlns:i="http://www.test.com/data/6/archive/import" xmlns="http://www.test.com/dos/asap" xmlns:n1="http://www.test.com/dos" xmlns:c="http://www.test.com/data/6/capture" file="00000001.pdf" checked="true">
        <code>X12345</code>
        <type>data</type>
    </s-20>
    <s-20 xmlns:a="http://www.test.com/data/6/archive" xmlns:i="http://www.test.com/data/6/archive/import" xmlns="http://www.test.com/dos/asap" xmlns:n1="http://www.test.com/dos" xmlns:c="http://www.test.com/data/6/capture" file="00000002.pdf" checked="false">
        <code>X67890</code>
        <type>data</type>
    </s-20>
    <s-20 xmlns:a="http://www.test.com/data/6/archive" xmlns:i="http://www.test.com/data/6/archive/import" xmlns="http://www.test.com/dos/asap" xmlns:n1="http://www.test.com/dos" xmlns:c="http://www.test.com/data/6/capture" file="00000003.pdf" checked="true">
        <code>X87687</code>
        <type>data</type>
    </s-20>
</Documents>

以上是关于从XSL中的命名空间节点获取子节点的主要内容,如果未能解决你的问题,请参考以下文章

我无法从我的 xml 中以 xsl 编码获取子循环中的根节点数据

读取具有多个名称空间的子节点

将命名空间从 java 传递给 xslt,并使用 java 中的参数作为 xslt 中的节点

如何将命名空间前缀设置为有效负载 xsl

无法从阿里巴巴集群中获取命名空间、节点和 Pod 数据

如何使用 XPath 忽略命名空间