簡體   English   中英

使用XSLT將XML轉換為XML,並刪除特定元素的換行符

[英]Transforming XML to XML using XSLT and removing linebreaks for specific elements

您好,我有一個問題與使用XSLT將輸入XML轉換為輸出XML以及刪除某些元素的換行符和縮進有關。

我想說明一下我的問題:

輸入:

<LISTESTOF>
  <ICSGROUP>
    <ICSNUM>1</ICSNUM>
    <ICSDKNAME>A1</ICSDKNAME>
    <ICSUKNAME>B2</ICSUKNAME>
  </ICSGROUP>
  <ICSGROUP>
    <ICSNUM>2</ICSNUM>
    <ICSDKNAME>B1</ICSDKNAME>
    <ICSUKNAME>B2</ICSUKNAME>
  </ICSGROUP>
</LISTESTOF>

輸出:

<LISTESTOF>
<ICSGROUP><ICSNUM>1</ICSNUM>
<ICSDKNAME>A1</ICSDKNAME>
<ICSUKNAME>B2</ICSUKNAME></ICSGROUP>
<ICSGROUP><ICSNUM>2</ICSNUM>
<ICSDKNAME>B1</ICSDKNAME>
<ICSUKNAME>B2</ICSUKNAME></ICSGROUP>
</LISTESTOF>

到目前為止,我的XSLT文件:

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

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/>
    <xsl:strip-space elements="*"/>

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

    <xsl:template match="LISTESTOF">
             <xsl:value-of select="'&#xA;'" /><LISTESTOF><xsl:apply-templates select="ICSGROUP"/></LISTESTOF>
    </xsl:template>

    <xsl:template match="ICSGROUP">
              <xsl:value-of select="'&#xA;'" /><ICSGROUP><xsl:apply-templates select="ICSNUM"/><xsl:value-of select="'&#xA;'" /><xsl:apply-templates select="ICSDKNAME"/><xsl:value-of select="'&#xA;'" /><xsl:apply-templates select="ICSUKNAME"/></ICSGROUP>
    </xsl:template>

    <xsl:template match="ICSNUM">
        <ICSNUM><xsl:value-of select="."/></ICSNUM>
    </xsl:template>

    <xsl:template match="ICSDKNAME">
        <ICSDKNAME><xsl:value-of select="."/></ICSDKNAME>
    </xsl:template>

    <xsl:template match="ICSUKNAME">
        <ICSUKNAME><xsl:value-of select="."/></ICSUKNAME>
    </xsl:template>


    </xsl:stylesheet>

有沒有更清潔的解決方案? 沒有定義的元素會發生什么? 他們會消失嗎? 有什么建議么? 先感謝您!

我將從刪除所有僅空白文本節點開始

<xsl:strip-space elements="*"/>

然后有一個身份模板,除非另有說明,否則從輸入到輸出的所有內容都將原樣復制(剝離空白后)

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

現在添加特定的模板供您想換行於元素

<xsl:template match="ICSGROUP|ICSDKNAME|ICSUKNAME">
  <xsl:text>&#xa;</xsl:text>
  <xsl:call-template name="ident"/>
</xsl:template>

還有一種特殊的方法, LISTESTOF可以在結束標記之前添加額外的換行符

<xsl:template match="LISTESTOF">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
    <xsl:text>&#xa;</xsl:text>
  </xsl:copy>
</xsl:template>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM