2

我对 XML 和 XLST 完全陌生。我有一份以 XML 格式输出的报告。它有几千条记录,但它是相同的两行数据,一遍又一遍地重复。我需要一种方法将输出 XML 文件限制为只有那两个唯一的数据行。

这是我的 XML 文件当前的示例:

<zd:Report_Data xmlns:zd="urn:com.xxxx.report/xxxx-Employee_Status-Outbound">
   <zd:Report_Entry>
<zd:empStat.emplStatusCode>A</zd:empStat.emplStatusCode>
<zd:empStat.name>Active Employee</zd:empStat.name>
<zd:worker>
<zd:empStat.lastUpdateDate>1/1/1968</zd:empStat.lastUpdateDate>
<zd:empStat.actvInd>1</zd:empStat.actvInd>
</zd:worker>
   </zd:Report_Entry>
   <zd:Report_Entry>
<zd:empStat.emplStatusCode>A</zd:empStat.emplStatusCode>
<zd:empStat.name>Active Employee</zd:empStat.name>
<zd:worker>
<zd:empStat.lastUpdateDate>1/1/1968</zd:empStat.lastUpdateDate>
<zd:empStat.actvInd>1</zd:empStat.actvInd>
</zd:worker>
   </zd:Report_Entry>
   <zd:Report_Entry>
<zd:empStat.emplStatusCode>A</zd:empStat.emplStatusCode>
<zd:empStat.name>Active Employee</zd:empStat.name>
<zd:worker>
<zd:empStat.lastUpdateDate>1/1/1968</zd:empStat.lastUpdateDate>
<zd:empStat.actvInd>0</zd:empStat.actvInd>
</zd:worker>
   </zd:Report_Entry>
   <zd:Report_Entry>
<zd:empStat.emplStatusCode>A</zd:empStat.emplStatusCode>
<zd:empStat.name>Active Employee</zd:empStat.name>
<zd:worker>
<zd:empStat.lastUpdateDate>1/1/1968</zd:empStat.lastUpdateDate>
<zd:empStat.actvInd>0</zd:empStat.actvInd>
</zd:worker>
   </zd:Report_Entry>
   </zd:Report_Data>

这就是我希望它看起来的样子:

<zd:Report_Data xmlns:zd="urn:com.xxxx.report/xxxx-Employee_Status-Outbound">
   <zd:Report_Entry>
<zd:empStat.emplStatusCode>A</zd:empStat.emplStatusCode>
<zd:empStat.name>Active Employee</zd:empStat.name>
<zd:worker>
<zd:empStat.lastUpdateDate>1/1/1968</zd:empStat.lastUpdateDate>
<zd:empStat.actvInd>1</zd:empStat.actvInd>
</zd:worker>
   </zd:Report_Entry>
   <zd:Report_Entry>
<zd:empStat.emplStatusCode>A</zd:empStat.emplStatusCode>
<zd:empStat.name>Active Employee</zd:empStat.name>
<zd:worker>
<zd:empStat.lastUpdateDate>1/1/1968</zd:empStat.lastUpdateDate>
<zd:empStat.actvInd>0</zd:empStat.actvInd>
</zd:worker>
   </zd:Report_Entry>
   </zd:Report_Data>

^^已更新


我看到了一些我认为可以在这个网站上工作的东西(http://stackoverflow.com/questions/3016929/selecting-unique-records-in-xslt-xpath),但我无法将它应用到我的情况。任何帮助将不胜感激!

这是我迄今为止根据我在这里阅读的另一篇文章所做的。不幸的是,它没有返回任何数据:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:key name="kItemBy3Children" match="Report_Entry"
     use="concat(empStat.emplStatusCode, '+', empStat.name, '+', empStat.lastUpdateDate, '+', empStat.actvInd)"/>

 <xsl:template match="/">
       <xsl:copy-of select=
        "*/item[generate-id()
              = generate-id(key('kItemBy4Children',
                                concat(empStat.emplStatusCode,
                                       '+', empStat.name,
                       '+', empStat.lastUpdateDate,     
                                       '+', empStat.actvInd)
                               )
                            )
               ]
        "/>
 </xsl:template>
</xsl:stylesheet>
4

4 回答 4

1

这个样式表...

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:ZD="urn:com.xxxx.report/xxxx-Employee_Status-Outbound">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

<xsl:key name="kItemBy4Children" match="ZD:Report_Entry"
     use="concat(ZD:empStat.emplStatusCode, '+', ZD:empStat.name, '+', ZD:worker/ZD:empStat.lastUpdateDate, '+', ZD:worker/ZD:empStat.actvInd)"/>

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

 <xsl:template match="ZD:Report_Data">
  <xsl:copy>
    <xsl:apply-templates select="@*" />
    <xsl:copy-of select=
      "ZD:Report_Entry[ generate-id() = generate-id(key('kItemBy4Children',
       concat(ZD:empStat.emplStatusCode, '+', ZD:empStat.name, '+', ZD:worker/ZD:empStat.lastUpdateDate, '+', ZD:worker/ZD:empStat.actvInd))[1])]"/>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

... 将转换此输入文档 ...

<ZD:Report_Data xmlns:ZD="urn:com.xxxx.report/xxxx-Employee_Status-Outbound">

<ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Active Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>1</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>

<ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Terminated Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>0</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>

<ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Active Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>1</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>

<ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Terminated Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>0</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>

</ZD:Report_Data>

...进入此输出文档...

<ZD:Report_Data xmlns:ZD="urn:com.xxxx.report/xxxx-Employee_Status-Outbound">
  <ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Active Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>1</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>
  <ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Terminated Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>0</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>
</ZD:Report_Data>

解释

Report_Data 节点被分组,其内容与 4 个子成员所测量的内容相同。换句话说,每个不同的 Report_Data 恰好有一个组,并且仅输出每个组的第一个成员。该技术称为 Muenchian 分组。我可以对 Muenchian 分组给出一个很长的解释,或者你可以搜索已经解释过这一点的数百个 StackOverflow 问题。我只会重复别人写的东西。

搜索起点:

更新

我对 empStat.emplStatusCode 字段进行了更正,并且 empStat.name 字段应以 ZD:worker/ 开头

于 2012-06-21T00:15:09.573 回答
0

如果您只需要选择前两行,那很容易:

<xsl:template match="/*">
  <xsl:copy>
    <xsl:copy-of select="*[1]|*[2]"/>
  </xsl:copy>
</xsl:template>

但也许我误解了这个问题。

于 2012-06-20T21:31:44.617 回答
0

这是与您的尝试不同的解决方案,因为我没有使用任何密钥。我认为这样更容易,因为您不必知道 XSLT 中的键是如何工作的(事实上,我不知道它们是如何工作的,因为到目前为止我从来不需要它们)。

请注意,我已经为您的命名空间前缀声明了一些 URI ZD;你需要插入你的。

首先,我已经应用了身份模板,基本上复制了所有内容。

然后,有一个<ZD:Report_Entry>元素模板。在该模板中,如果所选元素具有先前具有相同内容的同级元素,则省略所选元素。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ZD="http://xyz.abc">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

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

    <xsl:template match="/ZD:Report_Data/ZD:Report_Entry">
        <xsl:choose>
            <xsl:when test="preceding-sibling::ZD:Report_Entry[(ZD:empStat.emplStatusCode = current()/ZD:empStat.emplStatusCode) and (ZD:empStat.name = current()/ZD:empStat.name) and (ZD:worker/ZD:empStat.lastUpdateDate = current()/ZD:worker/ZD:empStat.lastUpdateDate) and (ZD:worker/ZD:empStat.actvInd = current()/ZD:worker/ZD:empStat.actvInd)]"/>
            <xsl:otherwise>
                <xsl:copy-of select="."/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

通过选择前面的兄弟元素来检查前面的兄弟<ZD:Report_Entry>元素。该元素的一个条件是其四个内容元素值与所选节点 ( current()) 的相应内容元素值相匹配。

如果您需要根据不同的标准比较记录是否相等,请修改方括号中的部分。

测试用例

此示例文档:

<ZD:Report_Data xmlns:ZD="http://xyz.abc">

<ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Active Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>1</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>

<ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Terminated Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>0</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>

<ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Active Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>1</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>

<ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Active Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>1</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>

<ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Active Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>1</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>

<ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Active Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>1</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>

<ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Active Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>1</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>

<ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Active Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>1</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>

<ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Active Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>1</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>

<ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Active Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>1</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>

<ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Active Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>1</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>

<ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Active Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>1</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>

<ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Active Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>1</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>

<ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Active Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>1</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>

<ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Active Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>1</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>

<ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Active Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>1</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>

<ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Active Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>1</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>

<ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Active Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>1</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>

<ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Active Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>1</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>

<ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Active Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>2</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>

<ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Active Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>1</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>

<ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Active Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>1</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>

<ZD:Report_Entry>
<ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
<ZD:empStat.name>Terminated Employee</ZD:empStat.name>
<ZD:worker>
<ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
<ZD:empStat.actvInd>0</ZD:empStat.actvInd>
</ZD:worker>
</ZD:Report_Entry>

</ZD:Report_Data>

被转换成这个输出:

<ZD:Report_Data xmlns:ZD="http://xyz.abc">
    <ZD:Report_Entry>
        <ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
        <ZD:empStat.name>Active Employee</ZD:empStat.name>
        <ZD:worker>
            <ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
            <ZD:empStat.actvInd>1</ZD:empStat.actvInd>
        </ZD:worker>
    </ZD:Report_Entry>
    <ZD:Report_Entry>
        <ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
        <ZD:empStat.name>Terminated Employee</ZD:empStat.name>
        <ZD:worker>
            <ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
            <ZD:empStat.actvInd>0</ZD:empStat.actvInd>
        </ZD:worker>
    </ZD:Report_Entry>
    <ZD:Report_Entry>
        <ZD:empStat.emplStatusCode>A</ZD:empStat.emplStatusCode>
        <ZD:empStat.name>Active Employee</ZD:empStat.name>
        <ZD:worker>
            <ZD:empStat.lastUpdateDate>1/1/1968</ZD:empStat.lastUpdateDate>
            <ZD:empStat.actvInd>2</ZD:empStat.actvInd>
        </ZD:worker>
    </ZD:Report_Entry>
</ZD:Report_Data>

更新:正确复制<ZD:Record_Entry>元素而不仅仅是其内容。

于 2012-06-20T21:47:43.863 回答
0

我试图将一些东西放在一起,以实现您在一般工作时想要的东西,而不是专门针对这个 XML 模式。

我累了,而且它非常软糖和 hackey(在讨厌之前请注意,人们),所以可能有更好的方法,但它似乎有效。

    <!-- root and static content -->
    <xsl:template match="/">
        <root>
            <xsl:apply-templates select='*/*' />
        </root>
    </xsl:template>


    <!-- children - output only unique -->
    <xsl:template match='*'>
        <xsl:variable name='node' select='.' />

        <!-- does this node have identical siblings up ahead? If so, skip it, and we'll output a sibling later -->
        <xsl:variable name='has_identical_siblings'>
            <xsl:for-each select='following-sibling::*[name() = name($node)]'>
                <xsl:call-template name='check_identical'>
                    <xsl:with-param name='this_node_profile'>
                        <xsl:copy-of select='$node' />
                    </xsl:with-param>
                    <xsl:with-param name='check_against'>
                        <xsl:copy-of select='.' />
                    </xsl:with-param>
                </xsl:call-template>
            </xsl:for-each>
        </xsl:variable>

        <!-- output? -->
        <xsl:if test='not(normalize-space($has_identical_siblings))'>
            <xsl:copy-of select='.' />
        </xsl:if>
    </xsl:template>

    <!-- util: two nodes are identical? -->
    <xsl:template name='check_identical'>
        <xsl:param name='this_node_profile' />
        <xsl:param name='check_against' />
        <xsl:if test='$this_node_profile = $check_against'>true</xsl:if>
    </xsl:template>

您可以在此处运行它(请参阅输出源 - 一名在职员工,一名已终止)。

于 2012-06-20T22:32:29.420 回答