草庐IT

xml - XSLT 逗号分隔元素

coder 2024-07-04 原文

我有以下 XML 文档:

<?xml version="1.0" encoding="UTF-8"?>
<cars>
    <car>
        <entrydata columnnumber="4" name="Colour">
            <text>Red</text>
        </entrydata>
    </car>
    <car>
        <entrydata columnnumber="4" name="Colour">
            <textlist>
                <text>Yellow</text>
                <text>Blue</text>
            </textlist>
        </entrydata>
    </car>
</cars>

以及以下 XSLT 样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com: xslt" exclude-result-prefixes="msxsl">
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="/">
    <records>
      <xsl:apply-templates select="//cars"/>
    </records>
  </xsl:template>
  <!--Top level template -->
  <xsl:template match="cars">
    <!-- Loop through each document (viewentry) and apply create the rows for each one-->
    <xsl:for-each select="car">
      <record>
        <xsl:attribute name="Colour">
          <xsl:value-of select="entrydata[@name='Colour']"/>
        </xsl:attribute>
       </record>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

这会产生以下输出:

<?xml version="1.0" encoding="UTF-8"?>
<records>
    <record Colour="Red"/>
    <record Colour="YellowBlue"/>
</records>

我将如何修改 XSLT 文件以使输出变为(注意 <textlist> 的逗号分隔):

<?xml version="1.0" encoding="UTF-8"?>
<records>
    <record Colour="Red"/>
    <record Colour="Yellow, Blue"/>
</records>

最佳答案

一个不那么冗长、纯粹的“推送式”XSLT 1.0 解决方案,它不使用硬编码字符串作为生成属性的名称:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="cars">
     <records>
       <xsl:apply-templates/>
     </records>
 </xsl:template>
 <xsl:template match="car">
  <record>
   <xsl:apply-templates/>
  </record>
 </xsl:template>
 <xsl:template match="entrydata">
  <xsl:attribute name="{@name}">
   <xsl:apply-templates/>
  </xsl:attribute>
 </xsl:template>
 <xsl:template match="text">
  <xsl:if test="position() >1">, </xsl:if>
  <xsl:value-of select="."/>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时:

<cars>
    <car>
        <entrydata columnnumber="4" name="Colour">
            <text>Red</text>
        </entrydata>
    </car>
    <car>
        <entrydata columnnumber="4" name="Colour">
            <textlist>
                <text>Yellow</text>
                <text>Blue</text>
            </textlist>
        </entrydata>
    </car>
</cars>

产生了想要的、正确的结果:

<records>
   <record Colour="Red"/>
   <record Colour="Yellow, Blue"/>
</records>

解释:

正确使用模板、模式匹配、AVT 和 position() 函数。


二。更简单的 XSLT 2.0 解决方案

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="cars">
     <records>
       <xsl:apply-templates/>
     </records>
 </xsl:template>
 <xsl:template match="car">
  <record>
   <xsl:apply-templates/>
  </record>
 </xsl:template>
 <xsl:template match="entrydata">
  <xsl:attribute name="{@name}">
   <xsl:value-of select=".//text" separator=", "/>
  </xsl:attribute>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于同一 XML 文档时(如上),会产生相同的正确结果:

<records>
   <record Colour="Red"/>
   <record Colour="Yellow, Blue"/>
</records>

解释:

正确使用模板、模式匹配、AVT 和 xsl:value-ofseparator 属性

关于xml - XSLT 逗号分隔元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11410684/

有关xml - XSLT 逗号分隔元素的更多相关文章

  1. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  2. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  3. ruby - 在哈希的键数组中追加元素 - 2

    查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用

  4. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  5. ruby - Hanami link_to 助手只呈现最后一个元素 - 2

    我是HanamiWorld的新人。我已经写了这段代码:moduleWeb::Views::HomeclassIndexincludeWeb::ViewincludeHanami::Helpers::HtmlHelperdeftitlehtml.headerdoh1'Testsearchengine',id:'title'hrdiv(id:'test')dolink_to('Home',"/",class:'mnu_orizontal')link_to('About',"/",class:'mnu_orizontal')endendendendend我在模板上调用了title方法。htm

  6. ruby - 将n维数组的每个元素乘以Ruby中的数字 - 2

    在Ruby中,是否有一种简单的方法可以将n维数组中的每个元素乘以一个数字?这样:[1,2,3,4,5].multiplied_by2==[2,4,6,8,10]和[[1,2,3],[1,2,3]].multiplied_by2==[[2,4,6],[2,4,6]]?(很明显,我编写了multiplied_by函数以区别于*,它似乎连接了数组的多个副本,不幸的是这不是我需要的)。谢谢! 最佳答案 它的长格式等价物是:[1,2,3,4,5].collect{|n|n*2}其实并没有那么复杂。你总是可以使你的multiply_by方法:c

  7. Ruby 正则表达式匹配逗号,但忽略括号中的逗号 - 2

    我正在尝试通过正则表达式拆分参数列表。这是一个带有我的参数列表的字符串:"a=b,c=3,d=[1,3,5,7],e,f=g"我想要的是:["a=b","c=3","d=[1,3,5,7]","e","f=g"]我试过先行,但Ruby不允许使用动态范围后行,所以这行不通:/(?如何让正则表达式忽略方括号中的所有内容? 最佳答案 也许这样的东西对你有用:str.scan(/(?:\[.*?\]|[^,])+/)编辑再三考虑。简单的非贪婪匹配器在某些嵌套括号的情况下会失败。 关于Ruby正则

  8. arrays - 计算数组中的匹配元素 - 2

    给定两个大小相等的数组,如何找到不考虑位置的匹配元素的数量?例如:[0,0,5]和[0,5,5]将返回2的匹配项,因为有一个0和一个5共同;[1,0,0,3]和[0,0,1,4]将返回3的匹配项,因为0有两场,1有一场;[1,2,2,3]和[1,2,3,4]将返回3的匹配项。我尝试了很多想法,但它们都变得相当粗糙和令人费解。我猜想有一些不错的Ruby习惯用法,或者可能是一个正则表达式,可以很好地回答这个解决方案。 最佳答案 您可以使用count完成它:a.count{|e|index=b.index(e)andb.delete_at

  9. ruby-on-rails - 在 fastercsv 中转义逗号值 - 2

    我正在研究csv生成。我正在分隔由逗号(,)分隔的值。如果字段中的值包含逗号,则不应在excel中分隔该字段。所以我想在那里放一个转义字符。我正在使用FasterCsv。那么我如何放置转义字符。fastercsv的转义字符是什么? 最佳答案 只需引用每个字段(默认为双引号),其中的逗号将被忽略:CSV.generate(:col_sep=>',',:quote_char=>'"')do|row|row"\"Quid,quid\",latinumdictum\n\"sit,altum\",viditur.\n"

  10. ruby - 使用 Nokogiri 和 Ruby 命名元素 "text" - 2

    我在尝试使用Nokogiri构建XML文档时遇到了一个小问题。我想将我的元素之一称为“文本”(请参阅​​下面粘贴代码的最底部)。通常,要创建一个新元素,我会执行类似以下的操作xml.text--但它似乎是.text是Nokogiri已经用来做其他事情的方法。因此,当我写这行时xml.textNokogiri没有创建名为的新元素但只是写了意味着成为元素内容的文本。我怎样才能让Nokogiri实际制作一个名为的元素??builder=Nokogiri::XML::Builder.newdo|xml|xml.TEI("xmlns"=>"http://www.tei-c.org/ns/1.0"

随机推荐