【问题标题】:XSLT: Add line breaks before preserve space elementsXSLT:在保留空格元素之前添加换行符
【发布时间】:2012-07-09 23:09:19
【问题描述】:

这是我之前编辑的关于保留空间元素之前换行符的问题。

假设我的xml是这样的,

<content>
<titleGroup>
<title>text</title>
</titleGroup>
<creators1>
<creator>
<personName>
  <Name>john</Name>
</personName>
</creator>
</creators1>
<creators2>
<affiliation>
<orgDiv> text </orgDiv>
<address>
<country>UK</country>
</address>
</affiliation>
</creators2>
</content>

我使用了以下 xsl:

<?xml version="1.0" encoding="utf-8"?>
<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:strip-space elements="*"/>
<xsl:preserve-space elements ="creators1 creators2"/>

<xsl:template match ="/">
 <xsl:copy>
  <xsl:apply-templates select="@* | node()"/>
</xsl:copy>    
</xsl:template>
</xsl:stylesheet>

此 xml 产生的输出,

<content><titleGroup><title>text</title></titleGroup><creators1>
<creator><personName><Name>john</Name></personName></creator></creators1><creators2>
<affiliation><orgDiv>text</orgDiv><address><country>UK</country></address></affiliation></creators2></content>

但我需要在保留空间的元素列表中的元素之前换行,而不是在该元素之后(标签需要开始和结束为单行),就像这样,

 <content><titleGroup><title>text</title></titleGroup>
 <creators1><creator><personName><Name>john</Name></personName></creator></creators1>
<creators2><affiliation><orgDiv>text</orgDiv><address><country>UK</country></address></affiliation></creators2></content>

我需要在 titlegroup 末尾和 creators1 末尾换行。

请不要建议使用&lt;xsl:text&gt;&lt;/xsl:text&gt;之类的答案,我需要通过使用保留空间或其他方式来做到这一点。

谢谢。

【问题讨论】:

    标签: xml xslt xpath


    【解决方案1】:

    显然,这在很大程度上取决于您如何处理它,但使用 MSXSL 3(我假设您是从命名空间中使用的),删除输出模式,摆脱保留空间并将文本放入空间中

    p>
        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
            <xsl:strip-space elements="*"/>
    
            <xsl:template match ="@* | node()">
                <xsl:copy>
                    <xsl:apply-templates select="@* | node()"/>
                </xsl:copy>    
            </xsl:template>
    
            <xsl:template match="creators1 | creators2">
                <xsl:text>
                </xsl:text>
                <xsl:copy>
                    <xsl:apply-templates select="@* | node()"/>
                </xsl:copy>  
            </xsl:template>
        </xsl:stylesheet>
    

    给你:

    <?xml version="1.0" encoding="UTF-16"?><content><titleGroup><title>text</title></titleGroup>
        <creators1><creator><personName><Name>john</Name></personName></creator></creators1>
        <creators2><affiliation><orgDiv> text </orgDiv><address><country>UK</country></address></affiliation></creators2></content>
    

    在 Xalan 和 Saxon 中也有类似的东西

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-23
      • 2019-03-13
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      • 2011-10-17
      • 1970-01-01
      • 2013-05-09
      相关资源
      最近更新 更多