XSLT,如何获取和输出组合元素

发布于 2024-11-03 02:01:47 字数 472 浏览 0 评论 0原文

亲爱的社区, 如果您能给我关于如何将其转换为的建议,那就太好了:

<div>  
something  
   <title>   this title  </title>  
    something else  
</div>  

不幸的是

<div>  
<title1>
something  </title1>  
<title2>  this title  </title2>  
<title3>  something else  </title>
</div>

,无法使用 substring-before/after 方法,因为 div 中有一个内部元素。此外,复制似乎也不适用于子字符串。您对如何转换上述 xml 有什么建议吗?

Dear community,
it would be great if you could give me an advice on how to transform this:

<div>  
something  
   <title>   this title  </title>  
    something else  
</div>  

into

<div>  
<title1>
something  </title1>  
<title2>  this title  </title2>  
<title3>  something else  </title>
</div>

Unfortunately the substring-before/after method cannot be used as there is an inner element inside div. Moreover, copy-of seems like it doesn't work with substring either. Do you have any advice on how to transform the above xml?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

笑脸一如从前 2024-11-10 02:01:47

该样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="div/text()|div/*">
        <xsl:element name="title{position()}">
            <xsl:value-of select="normalize-space(self::text())"/>
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

输出:

<div>
    <title1>something</title1>
    <title2> this title </title2>
    <title3>something else</title3>
</div>

This stylesheet:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="div/text()|div/*">
        <xsl:element name="title{position()}">
            <xsl:value-of select="normalize-space(self::text())"/>
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

Output:

<div>
    <title1>something</title1>
    <title2> this title </title2>
    <title3>something else</title3>
</div>
秋凉 2024-11-10 02:01:47

这个解决方案同时更精确和更通用

<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="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="/*/node()">
  <xsl:element name="title{position()}">
   <xsl:copy-of select="translate(self::text()|node(), '

', '  ')"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

当应用于提供的 XML 文档时

<div>
something      
    <title>   this title  </title>
     something else
</div>

产生更接近所需的结果(仅 NL 或 CR 字符会转换为空格):

<div>
   <title1> something           </title1>
   <title2>   this title  </title2>
   <title3>      something else </title3>
</div>

This solution is a little bit more precise and more general at the same time:

<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="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="/*/node()">
  <xsl:element name="title{position()}">
   <xsl:copy-of select="translate(self::text()|node(), '

', '  ')"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

When applied on the provided XML document:

<div>
something      
    <title>   this title  </title>
     something else
</div>

a more closer to the desired result is produced (only NL or CR characters are converted to space):

<div>
   <title1> something           </title1>
   <title2>   this title  </title2>
   <title3>      something else </title3>
</div>
神仙妹妹 2024-11-10 02:01:47

编辑

我刚刚意识到我的输出与你的不匹配。
但是@Alejandro的解决方案是完美的,所以我希望你不会对此感到太沮丧。


我想出了这个解决方案:

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

    <xsl:template match="/">
        <xsl:element name="div">
            <xsl:apply-templates />
        </xsl:element>
    </xsl:template>

    <xsl:template match="div/text()|div/title/text()">
        <xsl:element name="title{position()}">
            <xsl:copy-of select="normalize-space(.)" />
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

它产生以下输出:

<?xml version="1.0" encoding="UTF-8"?>
<div>
    <title1>something</title1>
    <title1>this title</title1>
    <title3>something else</title3>
</div>

Edit

I just realized that my output doesn't match yours.
But @Alejandro's solution is perfect, so I hope you won't be too upset about this one.


I came up with this solution:

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

    <xsl:template match="/">
        <xsl:element name="div">
            <xsl:apply-templates />
        </xsl:element>
    </xsl:template>

    <xsl:template match="div/text()|div/title/text()">
        <xsl:element name="title{position()}">
            <xsl:copy-of select="normalize-space(.)" />
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

which produces this output:

<?xml version="1.0" encoding="UTF-8"?>
<div>
    <title1>something</title1>
    <title1>this title</title1>
    <title3>something else</title3>
</div>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文