通过XSLT 1.0更改(反向)日期属性元素的属性值顺序

时间:2019-11-30 23:37:26

标签: xml xslt

已知:

  • 将在其中显示日期的属性名称(如果节点中没有日期,则该属性也将不会显示)

  • 属性所在元素的名称

源代码模型

<root>
    <parent attr-1="1000" attr-2="abc" DateAttributeParent="10.11.2017">  
        <child attr-3="whatever" attr-4="whatever2" DateAttributeChild="09.12.2010"> </child>
    </parent>
    <parent attr-1="2222" attr-2="abc" DateAttributeParent="04.06.2016">
        <child attr-3="whatever" attr-4="whatever2" DateAttributeChild="02.06.2009"> </child>
    </parent>
</root>

所需的输出

<root>
    <parent attr-1="1000" attr-2="abc" DateAttributeParent="2017.11.10">
        <child attr-3="whatever" attr-4="whatever2" DateAttributeChild="2010.12.09"> </child>
    </parent>
    <parent attr-1="2222" attr-2="abc" DateAttributeParent="2016.06.04">
        <child attr-3="whatever" attr-4="whatever2" DateAttributeChild="2009.06.02"> </child>
    </parent>
</root>

1 个答案:

答案 0 :(得分:0)

这有点乏味,但其他方面却微不足道:

XSLT 1.0

<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="yes"/>

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

<xsl:template match="@DateAttributeParent | @DateAttributeChild">
    <xsl:attribute name="{name()}">
        <xsl:value-of select="substring-after(substring-after(., '.'), '.')"/>
        <xsl:text>.</xsl:text>
        <xsl:value-of select="substring-before(substring-after(., '.'), '.')"/>
        <xsl:text>.</xsl:text>
        <xsl:value-of select="substring-before(., '.')"/>
    </xsl:attribute>
</xsl:template>

</xsl:stylesheet>