如何在XML文件中执行单位转换

2024-07-05 09:16:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个基本结构的xml输出文件(重要元素已展开):

?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type= "text/xsl" href="QRevStylesheet.xsl"?>
<Channel QRevFilename="20201222_193117_416_QRev" QRevVersion="QRev 4.16">
    <SiteInformation>
    <QA>
    <Instrument>
    <Processing>
    <Transect>
    <Transect>
    <Transect>
        <Filename type="char">8100_DM_20201222_1_003.PD0</Filename>
        <StartDateTime type="char">12/22/2020 19:24:09</StartDateTime>
        <EndDateTime type="char">12/22/2020 19:27:34</EndDateTime>
        <Discharge>
            <Top type="double" unitsCode="cms">4.295</Top>
            <Middle type="double" unitsCode="cms">8.816</Middle>
            <Bottom type="double" unitsCode="cms">1.205</Bottom>
            <Left type="double" unitsCode="cms">0.101</Left>
            <Right type="double" unitsCode="cms">0.415</Right>
            <Total type="double" unitsCode="cms">14.832</Total>
            <MovingBedPercentCorrection type="double">0.00</MovingBedPercentCorrection>
        </Discharge>
        <Edge>
            <StartEdge type="char">Right</StartEdge>
            <RectangularEdgeMethod type="char">Fixed</RectangularEdgeMethod>
            <VelocityMethod type="char">MeasMag</VelocityMethod>
            <LeftType type="char">Triangular</LeftType>
            <LeftEdgeCoefficient type="double">0.3535</LeftEdgeCoefficient>
            <LeftDistance type="double" unitsCode="m">2.1336</LeftDistance>
            <LeftNumberEnsembles type="double">10</LeftNumberEnsembles>
            <RightType type="char">Triangular</RightType>
            <RightEdgeCoefficient type="double">0.3535</RightEdgeCoefficient>
            <RightDistance type="double" unitsCode="m">3.3528</RightDistance>
            <RightNumberEnsembles type="double">10</RightNumberEnsembles>
        </Edge>

此输出文件的单位为公制(米和立方米/秒)。我希望以英制/英制单位输出,但我在编写样式表(xslt)文件时遇到了问题,该文件将生成一个1对1的文件,其中仅转换了单位和单位名称。python或powershell是更好的选择吗


Tags: 文件rightcmstype单位xmlfilenamedouble
1条回答
网友
1楼 · 发布于 2024-07-05 09:16:01

下面是一种使用XSLT进行转换的方法。我使用的因素需要检查,但这显示了基本原则

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

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

  <!  Match any element that has a unitsCode attribute  >
  <xsl:template match="*[@unitsCode]">
    <xsl:copy>
      <xsl:copy-of select="@type"/>
      <xsl:choose>
        <!  cm^2 to inch^2  >
        <xsl:when test="@unitsCode='cms'">
          <xsl:attribute name="unitsCode">ins</xsl:attribute>
          <xsl:value-of select=". div 6.452"/>
        </xsl:when>
        <!  meter to inch  >
        <xsl:when test="@unitsCode='m'">
          <xsl:attribute name="unitsCode">in</xsl:attribute>
          <xsl:value-of select=". *  39.37"/>
        </xsl:when>
        <!  Case where the conversion is not defined, leave as is  >
        <xsl:otherwise>
          <xsl:copy-of select="@unitsCode"/>
          <xsl:value-of select="."/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:copy>
  </xsl:template>
  
</xsl:stylesheet>

看到它在这里工作了吗:https://xsltfiddle.liberty-development.net/93nwMoX

相关问题 更多 >