xslt

时间:2018-01-11 09:38:44

标签: xml xslt

我有2个工作模板,只能逐个工作。如果我有两者,其中一个停止工作。我如何组合它们?感谢

输入XML:

<ProcessSourceSystemJournalEntry languageCode="en-US" systemEnvironmentCode="Production" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" versionID="9.2" xmlns="http://schema.infor.com/InforOAGIS/2" releaseID="2.5.0" xsi:schemaLocation="http://schema.infor.com/InforOAGIS/2 http://schema.infor.com/Trunk/InforOAGIS/BODs/Developer/ProcessSourceSystemJournalEntry.xsd">
    <DataArea>
        <SourceSystemJournalEntry>
            <JournalEntryLine sequence="1">
                <GLFullAccount>L625304000</GLFullAccount>
                <UserArea>
                    <Property>
                        <NameValue name="sunsys6.GeneralDescription13" type="StringType">INFORMATIQUE TELECOM TECHNOLOGIE ITT</NameValue>
                    </Property>
                    <Property>
                        <NameValue name="GeneralDescription16" type="StringType">NC</NameValue>
                    </Property>
                </UserArea>
            </JournalEntryLine>
        </SourceSystemJournalEntry>
    </DataArea>
</ProcessSourceSystemJournalEntry>

XSLT:一个模板,用于将元素的值修剪为30个字符,另一个模板用于“修复”@name属性,如果它错过了正确的前缀。两个模板都单独工作,但不能一起工作。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="http://schema.infor.com/InforOAGIS/2" xmlns:java="http://xml.apache.org/xslt/java" exclude-result-prefixes="java">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />   

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

    <!-- Trim general description -->  
    <xsl:template match="//my:NameValue">
        <NameValue name="{@name}" type="{@type}">
            <xsl:value-of select="substring(., 1, 30)"/>
        </NameValue>
    </xsl:template>

    <!-- Append sunsys6 in the beginning -->     
    <xsl:template match="@name">
        <xsl:attribute name="name">
            <xsl:choose>
                <xsl:when test="substring(.,1,7) != 'sunsys6'">
                    <xsl:value-of select="concat('sunsys6.',.)"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="."/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:attribute>
    </xsl:template>

</xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

更改

<xsl:template match="//my:NameValue">
    <NameValue name="{@name}" type="{@type}">
        <xsl:value-of select="substring(., 1, 30)"/>
    </NameValue>
</xsl:template>

<xsl:template match="my:NameValue">
    <NameValue>
        <xsl:apply-templates select="@*"/>
        <xsl:value-of select="substring(., 1, 30)"/>
    </NameValue>
</xsl:template>

您还可以缩短

<xsl:template match="@name">
    <xsl:attribute name="name">
        <xsl:choose>
            <xsl:when test="substring(.,1,7) != 'sunsys6'">
                <xsl:value-of select="concat('sunsys6.',.)"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="."/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:attribute>
</xsl:template>

<xsl:template match="@name[substring(.,1,7) != 'sunsys6']">
    <xsl:attribute name="name">
                <xsl:value-of select="concat('sunsys6.',.)"/>
    </xsl:attribute>
</xsl:template>