我的问题是我不知道如何更新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的新手,所以请原谅潜在的新手问题。这里有任何指导意见。
提前谢谢。
答案 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>