【问题标题】:Remove extra group level using XSLT使用 XSLT 删除额外的组级别
【发布时间】:2017-03-23 13:45:22
【问题描述】:

我需要在生成的输出中删除额外的组级别。我的要求是,我需要将元素 <FFF> 中的数据每 10 个字符拆分一次。我的代码几乎可以工作,但它填充了一个额外的组级别<FinalRecord>。这是我的 XML 文件:

输入

<RootParent>
<Data>
    <DetailRecord>
        <AAA>6</AAA>
        <BBB>22</BBB>
        <CCC>000000CC</CCC>
    </DetailRecord>
    <FinalRecord>
        <FFF>This is only for testing. I repeat. This is only for testing</FFF>
    </FinalRecord>
</Data>
</RootParent>

生成的输出

<RootParent>
<Data>
    <DetailRecord>
        <AAA>6</AAA>
        <BBB>22</BBB>
        <CCC>000000CC</CCC>
    </DetailRecord>
    <FinalRecord>
        <FinalRecord>
            <FFF>This is on</FFF>
        </FinalRecord>
        <FinalRecord>
            <FFF>ly for tes</FFF>
        </FinalRecord>
        <FinalRecord>
            <FFF>ting. I re</FFF>
        </FinalRecord>
        <FinalRecord>
            <FFF>peat. This</FFF>
        </FinalRecord>
        <FinalRecord>
            <FFF> is only f</FFF>
        </FinalRecord>
        <FinalRecord>
            <FFF>or testing</FFF>
        </FinalRecord>
        <FinalRecord>
            <FFF>. This is </FFF>
        </FinalRecord>
        <FinalRecord>
            <FFF>only</FFF>
        </FinalRecord>
    </FinalRecord>
</Data>
</RootParent>

预期输出

<RootParent>
<Data>
    <DetailRecord>
        <AAA>6</AAA>
        <BBB>22</BBB>
        <CCC>000000CC</CCC>
    </DetailRecord>
    <FinalRecord>
        <FFF>This is on</FFF>
    </FinalRecord>
    <FinalRecord>
        <FFF>ly for tes</FFF>
    </FinalRecord>
    <FinalRecord>
        <FFF>ting. I re</FFF>
    </FinalRecord>
    <FinalRecord>
        <FFF>peat. This</FFF>
    </FinalRecord>
    <FinalRecord>
        <FFF> is only f</FFF>
    </FinalRecord>
    <FinalRecord>
        <FFF>or testing</FFF>
    </FinalRecord>
    <FinalRecord>
        <FFF>. This is </FFF>
    </FinalRecord>
    <FinalRecord>
        <FFF>only</FFF>
    </FinalRecord>
</Data>
</RootParent>

我的 XSLT 代码

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="FFF">
    <xsl:analyze-string regex=".{{10}}" select=".">
        <xsl:matching-substring>
            <FinalRecord>
                <FFF>
                    <xsl:value-of select="."/>
                </FFF>
            </FinalRecord>
        </xsl:matching-substring>
        <xsl:non-matching-substring>
            <FinalRecord>
                <FFF>
                    <xsl:value-of select="."/>
                </FFF>
            </FinalRecord>
        </xsl:non-matching-substring>
    </xsl:analyze-string>
</xsl:template>
</xsl:stylesheet>

我的代码中是否有错误或遗漏?我被困住了,不知道该怎么办。我试图在&lt;xsl:template match="@*|node()"&gt; 之后插入&lt;xsl:template match="FinalRecord"/&gt; 以删除XML 文件中的&lt;FinalRecord&gt; 记录,但没有成功。我正在使用 XSLT v2.0。

非常感谢您的反馈。

谢谢。

【问题讨论】:

    标签: xml xslt xslt-2.0


    【解决方案1】:

    注意:

    元素FinalRecord被“identity-copy-template”处理,因为没有其他匹配规则。


    我尝试在&lt;xsl:template match="@*|node()"&gt; 之后插入&lt;xsl:template match="FinalRecord"/&gt;删除 XML 文件中的记录,但没有成功。

    删除有点不对。您需要处理元素,但无需再次创建相同的元素。

    看这个:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      • 2017-12-06
      • 1970-01-01
      • 1970-01-01
      • 2019-12-13
      • 2010-12-13
      • 1970-01-01
      相关资源
      最近更新 更多