【问题标题】:XSL removing empty nodes within the same codeXSL 删除同一代码中的空节点
【发布时间】:2010-09-10 12:51:53
【问题描述】:

我创建了以下 XSL 样式表,它接受一个 XML 数据包(从 SVN 给我)并将所有不包括文本“存档”的“入口”节点转换为逗号分隔的列表我的 ANT 脚本。示例 XML 文件如下所示......

<?xml version="1.0"?>
<lists>
   <list path="https://mydomain.com/branches">
      <entry kind="dir">
         <name>James_Work</name>
         <commit revision="2209">
            <author>James</author>
            <date>2010-09-02T11:02:08.584250Z</date>
         </commit>
      </entry>
   </list>
</lists>

...而我的 XSL 就是这个 ....

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes" />

   <xsl:variable name="selectionPropertyList">
      <xsl:for-each select="lists/list/entry[name!='archive']">svnType/<xsl:value-of select="name" />
         <xsl:if test="position()!=last()">,</xsl:if> 
      </xsl:for-each>
   </xsl:variable>

   <xsl:template match="/">
      <root>
         <svnType><xsl:copy-of select="$selectionPropertyList" /></svnType>
      </root>
   </xsl:template>
</xsl:stylesheet>

我遇到的问题是当我收到一个空包时。例如,如果我调用当前为空的 SVN 分支文件夹,并在我的 ANT 列表中得到一个空条目,则可能会发生这种情况。

一个示例 XML 数据包如下所示

<?xml version="1.0"?>
<lists>
   <list path="https://mydomain.com/branches">
   </list>
</lists>

有人知道我可以通过某种方式从我的列表中过滤掉这些空包吗?

谢谢, 詹姆斯

附:我已经尝试过这里给出的提示,但它与我在这里尝试做的不太匹配。 http://www.tek-tips.com/viewthread.cfm?qid=1088712&page=1

更新

更大的输入示例:

<?xml version="1.0"?>
<lists>
<list path="https://mydomain.com/website/branches">
<entry kind="dir">
   <name>ITNAM-752</name>
   <commit revision="2171">
       <author>jcb4337</author>
       <date>2010-08-30T15:13:21.006125Z</date>
   </commit>
</entry>
<entry kind="dir">
   <name>JCB4337-577</name>
   <commit revision="2171">
      <author>jcb4337</author>
      <date>2010-08-30T15:13:21.006125Z</date>
   </commit>
 </entry>
 <entry kind="dir">
     <name>JCB4337-726</name>
     <commit revision="2209">
        <author>jcb4337</author>
        <date>2010-09-02T11:02:08.584250Z</date>
      </commit>
  </entry>
  <entry kind="dir">
      <name>JCB4337-808</name>
      <commit revision="2206">
          <author>jcb4337</author>
          <date>2010-09-01T13:01:51.693625Z</date>
      </commit>
  </entry>
  <entry kind="dir">
        <name>JCB4337-847</name>
        <commit revision="2172">
            <author>jcb4337</author>
            <date>2010-08-30T15:14:12.803000Z</date>
         </commit>
  </entry>
 </list>
</lists>

我需要从 XSL 返回的输出如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<root>
 <branches>branches/ITNAM-752,branches/JCB4337-577,branches/JCB4337-726,branches/JCB4337-808,branches/JCB4337-847</branches>
</root>

我在上面使用了@Alejandro 的代码,我想我就差不多了。但我在此过程中得到了一些奇怪的结果。输出示例为:

<?xml version="1.0" encoding="UTF-8"?>
     <root>
      <branches>

          branches/ITNAM-752,
          branches/JCB4337-577,
          branches/JCB4337-726,
          branches/JCB4337-808,
          branches/JCB4337-847,

      </branches>
      </root>

所以...

1) 在列表元素之间获得大量空白。

2) 结果末尾还有一个逗号。

3) 当我尝试将其应用于我们的 SVN 标签文件夹时,我得到了一些奇怪的结果。标签略有不同,因为它包含我想从任何结果中排除的“存档”文件夹。

目前,当我使用相同的代码输出标签文件夹时,我得到了这个......

<?xml version="1.0" encoding="UTF-8"?>
  <root>
    <tags>


        archive

        jcb4337
        2010-08-31T08:56:51.006125Z


         tags/milestone 1-0-0,
         tags/milestone 1-0-0b,
         tags/milestone 1-0-1,
         tags/milestone 1-0-10,
         tags/milestone 1-0-11,
         tags/milestone 1-0-2,
         tags/milestone 1-0-3,
         tags/milestone 1-0-4,
         tags/milestone 1-0-5,
         tags/milestone 1-0-6,
         tags/milestone 1-0-7,
         tags/milestone 1-0-8,
         tags/milestone 1-0-9,

      </tags>
    </root>

使用@Alejandro 解决方案,出现大量空白和存档,以及所有时间戳、作者信息。

顺便说一句,如果您想知道我让 ANT 在 XSL 完成后立即进行令牌替换。它正在替换 XML 中的短语 svnType。我想不出使用 XSL 在每个节点上应用前缀分支/标签的方法。

希望这一切对您有所帮助,并再次感谢大家的努力。目前,XSL 对我来说有点玄学:-)。

【问题讨论】:

  • 如果这些答案不能涵盖您的问题,您可以使用剩余问题编辑您的问题。
  • 谢谢亚历杭德罗。根据其中一种解决方案,我在下面提供了更多信息。
  • 检查我的更新。下次记得在我的答案中发表评论。否则我不会收到通知。

标签: xml svn xslt ant


【解决方案1】:

这个样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" />
    <xsl:strip-space elements="*"/>
    <xsl:template match="list/entry[name!='archive']">
        <xsl:value-of select="concat('svnType/',
                                     name,
                                     substring(',',
                                               1,
                                               position()!=last())
                                     )"/>
    </xsl:template>
    <xsl:template match="/">
        <root>
            <svnType>
                <xsl:choose>
                    <xsl:when test="lists/list/entry/name!='archive'">
                        <xsl:apply-templates/>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:comment>There is no entry
                                     without "archive" name</xsl:comment>
                    </xsl:otherwise>
                </xsl:choose>
            </svnType>
        </root>
    </xsl:template>
</xsl:stylesheet>

输出:

<root>
    <svnType>svnType/James_Work</svnType>
</root>

有了这个输入:

<lists>
    <list path="https://mydomain.com/branches"></list>
</lists>

输出:

<root>
    <svnType>
        <!--There is no entry with "archive" name-->
    </svnType>
</root>

编辑xsl:strip-space 用于从输入源中仅去除空白文本节点。

编辑:另外,拉式方法:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" />
    <xsl:strip-space elements="*"/>
    <xsl:template match="entry[name!='archive']">
        <xsl:call-template name="output"/>
        <xsl:text>,</xsl:text>
    </xsl:template>
    <xsl:template match="entry[name!='archive'][last()]"
                  name="output"
                  priority="1">
        <xsl:value-of select="concat('svnType/',name)"/>
    </xsl:template>
    <xsl:template match="lists">
        <root>
            <svnType>
                <xsl:apply-templates/>
            </svnType>
        </root>
    </xsl:template>
    <xsl:template match="list[not(entry/name!='archive')]">
        <xsl:comment>There is no entry without "archive" name</xsl:comment>
    </xsl:template>
</xsl:stylesheet>

两个样式表输出:

<root>
   <svnType>svnType/ITNAM-752,svnType/JCB4337-577,svnType/JCB4337-726,svnType/JCB4337-808,svnType/JCB4337-847</svnType>
</root>

【讨论】:

  • 这是我目前正在尝试使用的。唯一的问题是我现在要找回这种东西......
  • 存档 jcb4337 2010-08-31T08:56:10.756125Z 里程碑 1-0-0,里程碑 1-0-1, 里程碑 1-0-3, 里程碑 1-0-4, 里程碑 1-0-5, 里程碑 1-0-6,
  • 所以我得到了存档,条目的节点组合成一个字符串和一个额外的逗号在最后。它没有在这里显示,但我也得到了很多空白。虽然喜欢评论方法:-)
  • @James Buckingham:请发表您的实际意见,可能会有差异。
【解决方案2】:

将匹配表达式更改为:

<xsl:template match="/lists[list/entry[name != 'archive']]">

应该可以。

(我也会使用应用模板而不是 $selectionPropertyList,但这是另一个问题)

【讨论】:

    【解决方案3】:
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" />
    
    <xsl:template match="list">
        <xsl:text>svnType/</xsl:text><xsl:value-of select="entry/name" />
        <xsl:if test="position()!=last()">,</xsl:if>
    </xsl:template>
    
    <xsl:template match="/">
        <root>
            <svnType>
                <xsl:apply-templates select="//list[entry/name!='archive'][*]" />
            </svnType>
        </root>
    </xsl:template>
    </xsl:stylesheet>
    

    基本上 [*] 表示列表元素应该有子节点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多