如何更新XMl文件标签的范围?

时间:2018-05-27 08:36:04

标签: java xml xslt

我的问题是我不知道如何更新XML文件。在以下XML文件中,我想在文件中已存在的另一个标记中包含一些标记 **我的XML文件如下:**

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <PayrunDetails>
        <PayrunNumber>000777</PayrunNumber>
    </PayrunDetails>
    <PayLocation>
        <LocationCode>ACT</LocationCode>
        <LocationDescription>ACT</LocationDescription>
        <CompanyDetails>
            <CName>APPLE Limited</CName>
            <Payslip>
                <StaffNumber>12345</StaffNumber>
                <PayDetails>
                    <AmountGross>9999</AmountGross>
                    <ComponentDetails>
                        <ComponentType>SALARY</ComponentType>
                        <Amount>1999</Amount>
                        <YTDAmount>10616</YTDAmount>
                    </ComponentDetails>
                    <ComponentDetails>
                        <ComponentType>SALARY</ComponentType>
                        <Amount>7305</Amount>
                        <YTDAmount>76703</YTDAmount>
                    </ComponentDetails>
                </PayDetails>
            </Payslip>
        </CompanyDetails>
    </PayLocation>
</root>

我想要的输出文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <PayrunDetails>
        <PayrunNumber>000777</PayrunNumber>
    </PayrunDetails>
    <PayLocation>
        <LocationCode>ACT</LocationCode>
        <LocationDescription>ACT</LocationDescription>
        <CompanyDetails>
            <CName>APPLE Limited</CName>
            <Payslip>
                <StaffNumber>12345</StaffNumber>
                <PayDetails>
                    <AmountGross>9999</AmountGross>
                    <ComponentDetails>
                        <ComponentType ID="SALARY">
                            <Amount>1999</Amount>
                            <YTDAmount>10616</YTDAmount>
                        </ComponentType>
                    </ComponentDetails>
                    <ComponentDetails>
                        <ComponentType ID="TAX">
                            <Amount>7305</Amount>
                            <YTDAmount>76703</YTDAmount>
                        </ComponentType>
                    </ComponentDetails>
                </PayDetails>
            </Payslip>
        </CompanyDetails>
    </PayLocation>
</root>

在上面所需的文件中,您会发现ComponentType标记包含其他标记存在于ComponentDetails标记内。

对于上述问题,我想使用XSLT,但我不知道应该编写什么代码来获得解决方案。
我是XSLT的新手,所以请原谅潜在的新手问题。这里有任何指导意见。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

首先阅读XSLT中的i dentity transform,其中涉及此模板

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

(如果你可以使用XSLT 3.0,你可以改为编写<xsl:mode on-no-match="shallow-copy"/>

这将按原样复制所有节点和属性,在您的情况下几乎可以使用它。

您可以通过多种方式转换所需的节点。一种方法是匹配ComponentDetails标记,在输出中创建新的ComponentType,以及选择其他子节点的代码。

<xsl:template match="ComponentDetails">
  <xsl:copy>
      <ComponentType ID="{ComponentType}">
          <xsl:apply-templates />
      </ComponentType>
  </xsl:copy>
</xsl:template>

这会使用Attribute Value Templates来创建ID属性。

请注意,<xsl:apply-templates /><xsl:apply-templates select="node()" />的简写,因此仍会选择输入文档中的现有ComponentType元素,然后由身份模板进行匹配。要阻止ComponentType输出两次,您需要添加一个模板以匹配并忽略它。

<xsl:template match="ComponentType" />

试试这个XSLT

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

  <xsl:strip-space elements="*" />

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

  <xsl:template match="ComponentDetails">
    <xsl:copy>
        <ComponentType ID="{ComponentType}">
            <xsl:apply-templates />
        </ComponentType>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="ComponentType" />
</xsl:stylesheet>