将部分插入XML文档

时间:2017-08-30 08:37:59

标签: xml xslt

我有这个源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>

2 个答案:

答案 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

,因此发生了问题