XSLT在每个文本节点上应用模板

时间:2018-04-13 14:39:03

标签: xml xslt xslt-1.0

我有一个从一个xml格式到另一个xml格式的复杂转换,需要在转换后修剪每个文本元素上所有可能的前导和拖尾空格。

XML输入类似于:

<Records>
  <Record>
    <FirstName>FIRST</FirstName>
    <MiddleName>MID</MiddleName>
    <LastName>LAST</LastName>
    <VehType>PCAR</VehType>
    <VehType2>VN</VehType2>
    <VehMake>CHEV</VehMake>
    <VehModel>AST</VehModel>
    <VehColor>DBL</VehColor>
    <VehVIN>1234123</VehVIN>
  </Record>
</Records>

样式表示例是:

<xsl:template match="Record">
    <MyRecord>
        <NameRecord>
            <FirstName>
                <xsl:value-of select="FirstName" />
            </FirstName>
            <MiddleName>
                <xsl:value-of select="MiddleName" />
            </MiddleName>
            <LastName>
                <xsl:value-of select="LastName" />
            </LastName>
        </NameRecord>
        <VehicleRecord>
            <VehicleType>
                <xsl:value-of select="VehType" />
            </VehicleType>
            <MakeOfCar>
                <xsl:value-of select="VehMake" />
            </MakeOfCar>
            <ModelOfCar>
                <xsl:value-of select="VehModel" />
            </ModelOfCar>
            <ColorPrimary>
                <xsl:value-of select="VehColor" />
            </ColorPrimary>
            <VehicleIDNumber>
                <xsl:value-of select="VehVIN" />
            </VehicleIDNumber>
            <YearOfCar>
                <xsl:value-of select="VehYear" />
            </YearOfCar>
        </VehicleRecord>
    </MyRecord>
</xsl:template>

但是更复杂,有很多关卡和内容。问题是,任何传入的xml元素都可能包含<VehVIN> 1234123 </VehVIN>之类的数据,我需要修剪前导空格和尾随空格。找到this漂亮的解决方案并尝试将其集成到我的样式表中,但没有运气。

<xsl:template match="text()">
    <xsl:call-template name="string-trim">
        <xsl:with-param name="string" select="." />
    </xsl:call-template>
</xsl:template>

2 个答案:

答案 0 :(得分:4)

而不是这样做......

<xsl:value-of select="FirstName" />

这样做,因为这将允许你的text()模板匹配

<xsl:apply-templates select="FirstName/text()" />

与其他元素类似。

事实上,您可以<xsl:apply-templates select="FirstName" />,因为XSLT的内置模板将匹配FirstName,然后将跳过该节点并选择其子节点。

答案 1 :(得分:3)

您可以使用以下模板:

default(DateTime?)

它删除每个文本元素上的所有前导和尾随空格。