我有这个源XML:
<?xml version="1.0" encoding="UTF-8"?>
<SyncSupplierInvoice xmlns="http://schema.infor.com/InforOAGIS/2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" languageCode="en-US" releaseID="9.2" systemEnvironmentCode="Production" versionID="2.8.0">
<UserArea>
<Property>
<NameValue name="TypeCode">PS</NameValue>
</Property>
<Property>
<NameValue name="TaxCode">TGPLG180</NameValue>
</Property>
<Property>
<NameValue name="TaxOrg">*</NameValue>
</Property>
</UserArea>
</SyncSupplierInvoice>
UserArea中有 3个属性部分。我想插入第4部分 customTaxCode ,其中包含TaxCode的最后一个字符。像这样:
<?xml version="1.0" encoding="UTF-8"?>
<SyncSupplierInvoice xmlns="http://schema.infor.com/InforOAGIS/2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" languageCode="en-US" releaseID="9.2" systemEnvironmentCode="Production" versionID="2.8.0">
<UserArea>
<Property>
<NameValue name="TypeCode">PS</NameValue>
</Property>
<Property>
<NameValue name="TaxCode">TGPLG180</NameValue>
</Property>
<Property>
<NameValue name="customTaxCode">0</NameValue>
</Property>
<Property>
<NameValue name="TaxOrg">*</NameValue>
</Property>
</UserArea>
</SyncSupplierInvoice>
我的XSLT只是部分工作。问题是它在现有的Property元素下创建了Property元素,而不是兄弟元素。我不确定如何实现结果。提前感谢您的任何建议。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="http://schema.infor.com/InforOAGIS/2" xmlns:java="http://xml.apache.org/xslt/java" exclude-result-prefixes="java">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//my:UserArea/my:Property/my:NameValue[@name='TaxCode']">
<xsl:copy-of select="."/>
<Property>
<NameValue name="customTaxCode">
<xsl:value-of select="substring(., string-length(.), 1)" />
</NameValue>
</Property>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:0)
而不是匹配my:NameValue
的模板,而是将其更改为与相关的my:Property
相匹配。
<xsl:template match="//my:UserArea/my:Property[my:NameValue/@name='TaxCode']">
或者,更好的是,开始与//
匹配的模板是不必要的。
<xsl:template match="my:Property[my:NameValue/@name='TaxCode']">
请注意,您还应该向XSLT添加默认命名空间声明,以确保您创建的新Property
元素与源
试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="http://schema.infor.com/InforOAGIS/2"
xmlns="http://schema.infor.com/InforOAGIS/2"
xmlns:java="http://xml.apache.org/xslt/java"
exclude-result-prefixes="my java">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="my:Property[my:NameValue/@name='TaxCode']">
<xsl:copy-of select="."/>
<Property>
<NameValue name="customTaxCode">
<xsl:value-of select="substring(my:NameValue, string-length(my:NameValue), 1)" />
</NameValue>
</Property>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
使用此
<xsl:template match="//my:UserArea/my:Property[my:NameValue[@name='TaxCode']]">
由于您将其用作NameValue lavel
,因此发生了问题