简体   繁体   English

XSLT 变换未应用于复杂 XML

[英]XSLT transformation not applied to complex XML

I have a custom XML as shwon below我有一个自定义 XML 如下所示

<AllValues xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <content>
        <data>
            <item>
                <value xsi:type="DATETIME">
                    <value>2020-12-31T09:30:00+00:00</value>
                </value>
            </item>
        </data>
    </content>
</AllValues>

From the defined styles sheet I would like to extract out the 2020-12-31T09:30:00+00:00 as September 24th, 2020 09:30 .从定义的 styles 表中,我想提取2020-12-31T09:30:00+00:00September 24th, 2020 09:30 However seems like the style sheet fails to identify the element in this case.但是,在这种情况下,样式表似乎无法识别元素。

My style sheet (adapted from here ) is defined as below我的样式表(改编自此处)定义如下

<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"/>
<xsl:strip-space elements="*"/>
    <xsl:template match="/">
        <output>
            <xsl:variable name="month" select="substring(date, 6, 2)"/>
            <xsl:choose>
                <xsl:when test="$month=1">January</xsl:when>
                <xsl:when test="$month=2">February</xsl:when>
                <xsl:when test="$month=3">March</xsl:when>
                <xsl:when test="$month=4">April</xsl:when>
                <xsl:when test="$month=5">May</xsl:when>
                <xsl:when test="$month=6">June</xsl:when>
                <xsl:when test="$month=7">July</xsl:when>
                <xsl:when test="$month=8">August</xsl:when>
                <xsl:when test="$month=9">September</xsl:when>
                <xsl:when test="$month=10">October</xsl:when>
                <xsl:when test="$month=11">November</xsl:when>
                <xsl:when test="$month=12">December</xsl:when>
            </xsl:choose>
            <xsl:text> </xsl:text>
            <xsl:variable name="day" select="number(substring(date, 9, 2))"/>
            <xsl:value-of select="$day"/>
            <xsl:choose>
                <xsl:when test="$day=1 or $day=21 or $day=31">st</xsl:when>
                <xsl:when test="$day=2 or $day=22">nd</xsl:when>
                <xsl:otherwise>th</xsl:otherwise>
            </xsl:choose>
            <xsl:text>, </xsl:text>
            <xsl:value-of select="substring(date, 1, 4)"/>
            <xsl:text> </xsl:text>
            <xsl:value-of select="substring(date, 12, 5)"/>
        </output>
    </xsl:template>
</xsl:stylesheet>

A very basic scenario of this seems to work fine but I cant get a complect xml transformed here.一个非常基本的场景似乎工作正常,但我无法在这里转换一个完整的 xml。 Here is the implementation of a basic situation where it works https://xsltfiddle.liberty-development.net/bEzknt7/1这是它工作的基本情况的实现https://xsltfiddle.liberty-development.net/bEzknt7/1

Would really appreciate some help here非常感谢这里的一些帮助

You are simply not matching the right node in your XSLT.您根本没有匹配 XSLT 中的正确节点。
Change the date node in your expressions to .将表达式中的date节点更改为. and set the right context node in your template:并在模板中设置正确的上下文节点:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="//*[@xsi:type='DATETIME']/value">
        <xsl:element name="output">
            <xsl:variable name="month" select="substring(., 6, 2)"/>
            <xsl:choose>
                <xsl:when test="$month=1">January</xsl:when>
                <xsl:when test="$month=2">February</xsl:when>
                <xsl:when test="$month=3">March</xsl:when>
                <xsl:when test="$month=4">April</xsl:when>
                <xsl:when test="$month=5">May</xsl:when>
                <xsl:when test="$month=6">June</xsl:when>
                <xsl:when test="$month=7">July</xsl:when>
                <xsl:when test="$month=8">August</xsl:when>
                <xsl:when test="$month=9">September</xsl:when>
                <xsl:when test="$month=10">October</xsl:when>
                <xsl:when test="$month=11">November</xsl:when>
                <xsl:when test="$month=12">December</xsl:when>
            </xsl:choose>
            <xsl:text> </xsl:text>
            <xsl:variable name="day" select="number(substring(., 9, 2))"/>
            <xsl:value-of select="$day"/>
            <xsl:choose>
                <xsl:when test="$day=1 or $day=21 or $day=31">st</xsl:when>
                <xsl:when test="$day=2 or $day=22">nd</xsl:when>
                <xsl:otherwise>th</xsl:otherwise>
            </xsl:choose>
            <xsl:text>, </xsl:text>
            <xsl:value-of select="substring(., 1, 4)"/>
            <xsl:text> </xsl:text>
            <xsl:value-of select="substring(., 12, 5)"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

Its output is:其 output 为:

<output>December 31st, 2020 09:30</output>

This works fine for your MCVE and works for all elements with the xsi:type attribute equal to DATETIME .这适用于您的 MCVE,并且适用于xsi:type属性等于DATETIME的所有元素。

If your input has multiple dateTime values that need to be converted, then define a named template to serve as a function that can be called when a dateTime value is encountered.如果您的输入有多个需要转换的dateTime值,则定义一个命名模板作为 function 可以在遇到dateTime值时调用。 For example:例如:

XML XML

<AllValues xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <content>
        <data>
           <item>
                <value xsi:type="STRING">
                    <value>Alpha</value>
                </value>
            </item>
            <item>
                <value xsi:type="DATETIME">
                    <value>2019-08-02T15:05:00+00:00</value>
                </value>
            </item>
        </data>
        <data>
           <item>
                <value xsi:type="STRING">
                    <value>Bravo</value>
                </value>
            </item>
            <item>
                <value xsi:type="DATETIME">
                    <value>2020-12-31T09:30:00+00:00</value>
                </value>
            </item>
        </data>
    </content>
</AllValues>

XSLT 1.0 XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="value[@xsi:type='DATETIME']/value">
    <xsl:copy>
        <xsl:call-template name="convert-dateTime">
            <xsl:with-param name="dateTime" select="."/>
        </xsl:call-template>
    </xsl:copy>
</xsl:template>

<xsl:template name="convert-dateTime">
    <xsl:param name="dateTime"/>
    <xsl:variable name="month" select="substring($dateTime, 6, 2)"/>
    <xsl:choose>
        <xsl:when test="$month=1">January</xsl:when>
        <xsl:when test="$month=2">February</xsl:when>
        <xsl:when test="$month=3">March</xsl:when>
        <xsl:when test="$month=4">April</xsl:when>
        <xsl:when test="$month=5">May</xsl:when>
        <xsl:when test="$month=6">June</xsl:when>
        <xsl:when test="$month=7">July</xsl:when>
        <xsl:when test="$month=8">August</xsl:when>
        <xsl:when test="$month=9">September</xsl:when>
        <xsl:when test="$month=10">October</xsl:when>
        <xsl:when test="$month=11">November</xsl:when>
        <xsl:when test="$month=12">December</xsl:when>
    </xsl:choose>
    <xsl:text> </xsl:text>
    <xsl:variable name="day" select="number(substring($dateTime, 9, 2))"/>
    <xsl:value-of select="$day"/>
    <xsl:choose>
        <xsl:when test="$day=1 or $day=21 or $day=31">st</xsl:when>
        <xsl:when test="$day=2 or $day=22">nd</xsl:when>
        <xsl:otherwise>th</xsl:otherwise>
    </xsl:choose>
    <xsl:text>, </xsl:text>
    <xsl:value-of select="substring($dateTime, 1, 4)"/>
    <xsl:text> </xsl:text>
    <xsl:value-of select="substring($dateTime, 12, 5)"/>
</xsl:template>

</xsl:stylesheet>

Result结果

<?xml version="1.0" encoding="UTF-8"?>
<AllValues xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <content>
    <data>
      <item>
        <value xsi:type="STRING">
          <value>Alpha</value>
        </value>
      </item>
      <item>
        <value xsi:type="DATETIME">
          <value>August 2nd, 2019 15:05</value>
        </value>
      </item>
    </data>
    <data>
      <item>
        <value xsi:type="STRING">
          <value>Bravo</value>
        </value>
      </item>
      <item>
        <value xsi:type="DATETIME">
          <value>December 31st, 2020 09:30</value>
        </value>
      </item>
    </data>
  </content>
</AllValues>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM