Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml xsl:转换每个标记值_Xml_Xml Parsing_Xslt 2.0 - Fatal编程技术网

Xml xsl:转换每个标记值

Xml xsl:转换每个标记值,xml,xml-parsing,xslt-2.0,Xml,Xml Parsing,Xslt 2.0,我正在JMeter中创建一些性能测试,并试图使测试脚本尽可能可配置。例如,我使用以下XML: <Party> <Id>123456</Id> </Party> <Agreement> <InternalAgreement> <Id>2508153801</Id> <AgreementType>UYTU</AgreementType>

我正在JMeter中创建一些性能测试,并试图使测试脚本尽可能可配置。例如,我使用以下XML:

<Party>
    <Id>123456</Id>
</Party>
<Agreement>
    <InternalAgreement>
        <Id>2508153801</Id>
        <AgreementType>UYTU</AgreementType>
        <AgreementTypeCombination>ULLL</AgreementTypeCombination>
        <ContractType>3</ContractType>
        <IdCombination>250851536</IdCombination>
        <ProductCode>A260</ProductCode>
    </InternalAgreement>
</Agreement>
<PartyAgreementRole>
    <PartyInternalAgreementRole>
        <PartyAgreementRoleType>AWS</PartyAgreementRoleType>
        <RoleTypeSequenceNumber>054</RoleTypeSequenceNumber>
        <EndDate>2016-11-28</EndDate>
    </PartyInternalAgreementRole>
</PartyAgreementRole>
我希望使用xslt将上述xml转换为以下内容,并提及不同的Id:

<Party>
    <Id>${Id_1}</Id>
</Party>
<Agreement>
    <InternalAgreement>
        <Id>${Id_2}</Id>
        <AgreementType>${AgreementType}</AgreementType>
        <AgreementTypeCombination>${AgreementTypeCombination}</AgreementTypeCombination>
        <ContractType>${ContractType}</ContractType>
        <IdCombination>${IdCombination}</IdCombination>
        <ProductCode>${ProductCode}</ProductCode>
    </InternalAgreement>
</Agreement>
<PartyAgreementRole>
    <PartyInternalAgreementRole>
        <PartyAgreementRoleType>${PartyAgreementRoleType}</PartyAgreementRoleType>
        <RoleTypeSequenceNumber>${RoleTypeSequenceNumber}</RoleTypeSequenceNumber>
        <EndDate>${EndDate}</EndDate>
    </PartyInternalAgreementRole>
</PartyAgreementRole>
到目前为止,我还没有在xslt中创建一个通用的解决方案来实现这一点。到目前为止,我已经想到:

  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="node()/text()[.='VN']">${PartyAgreementRoleType}</xsl:template>
但这远远不是解决办法。有人能告诉我正确的方向吗

我不理解代码中的${PartyAgreementRoleType},因为在示例输入中似乎没有任何VN

但是,如果要填充Id元素,则

<xsl:template match="Id">
    <xsl:copy>
        <xsl:text>${Id_</xsl:text>
        <xsl:number level="any"/>
        <xsl:text>}</xsl:text>
    </xsl:copy>
</xsl:template>
如果其他元素要用它们的名称填充,那么

<xsl:template match="*[not(*)]">
    <xsl:copy>
        <xsl:text>${</xsl:text>
        <xsl:value-of select="local-name()"/>
        <xsl:text>}</xsl:text>
    </xsl:copy>
</xsl:template>
应该实现这一点,所以将这些模板放在一起

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

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

    <xsl:template match="*[not(*)]">
        <xsl:copy>
            <xsl:text>${</xsl:text>
            <xsl:value-of select="local-name()"/>
            <xsl:text>}</xsl:text>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Id" priority="5">
        <xsl:copy>
            <xsl:text>${Id_</xsl:text>
            <xsl:number level="any"/>
            <xsl:text>}</xsl:text>
        </xsl:copy>
    </xsl:template>

</xsl:transform>
哪种转变

<Root>
<Party>
    <Id>123456</Id>
</Party>
<Agreement>
    <InternalAgreement>
        <Id>2508153801</Id>
        <AgreementType>UYTU</AgreementType>
        <AgreementTypeCombination>ULLL</AgreementTypeCombination>
        <ContractType>3</ContractType>
        <IdCombination>250851536</IdCombination>
        <ProductCode>A260</ProductCode>
    </InternalAgreement>
</Agreement>
<PartyAgreementRole>
    <PartyInternalAgreementRole>
        <PartyAgreementRoleType>AWS</PartyAgreementRoleType>
        <RoleTypeSequenceNumber>054</RoleTypeSequenceNumber>
        <EndDate>2016-11-28</EndDate>
    </PartyInternalAgreementRole>
</PartyAgreementRole>
</Root>
进入


在线。

Martin,感谢您分享您的知识。你的解决方案正是我想要的。当然,“VN”应该是“AWS”
<?xml version="1.0" encoding="UTF-8"?><Root>
<Party>
    <Id>${Id_1}</Id>
</Party>
<Agreement>
    <InternalAgreement>
        <Id>${Id_2}</Id>
        <AgreementType>${AgreementType}</AgreementType>
        <AgreementTypeCombination>${AgreementTypeCombination}</AgreementTypeCombination>
        <ContractType>${ContractType}</ContractType>
        <IdCombination>${IdCombination}</IdCombination>
        <ProductCode>${ProductCode}</ProductCode>
    </InternalAgreement>
</Agreement>
<PartyAgreementRole>
    <PartyInternalAgreementRole>
        <PartyAgreementRoleType>${PartyAgreementRoleType}</PartyAgreementRoleType>
        <RoleTypeSequenceNumber>${RoleTypeSequenceNumber}</RoleTypeSequenceNumber>
        <EndDate>${EndDate}</EndDate>
    </PartyInternalAgreementRole>
</PartyAgreementRole>
</Root>