XSLT;具有嵌套属性的XML转换

时间:2017-10-16 13:35:32

标签: xml xslt

对于某些MODID,我想将下面代码中MODOUT的值从4更改为6,但保留MODOUT的其他值不变。 我想为OWNINST的不同值做这件事 因此,例如,对于OWNINST 1439582 | 1我想将MODOUT更改为4,对于MODID 09 | 24864,09 | 24899而不是09 | 24865,对于OWNINST 1439582 | 1我想将MODOUT更改为4以进行MODID 09 | 12345但不是09 | 24863。我不想更改OWNINST 1439582 | 2的任何模块(突出显示学生可以拥有多个实例) 我熟悉如何使用一个标识符更改实例级别的字段(例如,使用OWNINST更改FUNDCOMP),但不熟悉如何使用两个标识符(即OWNINST和MODID)更改字段。有人可以建议吗?

<Student>
<BIRTHDTE>1986-05-29</BIRTHDTE>
<ULN>8402398897</ULN>
    <Instance>
    <NUMHUS>1</NUMHUS>
    <OWNINST>1439582|1</OWNINST>
    <FUNDCOMP>2</FUNDCOMP>
        <StudentOnModule>
            <MODID>09|24864</MODID>
            <MODOUT>4</MODOUT>
            <MODSTAT>2</MODSTAT>
        </StudentOnModule>
        <StudentOnModule>
            <MODID>09|24865</MODID>
            <MODOUT>2</MODOUT>
            <MODSTAT>2</MODSTAT>
        </StudentOnModule>
        <StudentOnModule>
            <MODID>09|24899</MODID>
            <MODOUT>4</MODOUT>
            <MODSTAT>2</MODSTAT>
        </StudentOnModule>
    </Instance>
</Student>
<Student>
<BIRTHDTE>1985-05-29</BIRTHDTE>
<ULN>8402398897</ULN>
    <Instance>
    <NUMHUS>1</NUMHUS>
    <OWNINST>1439582|1</OWNINST>
    <FUNDCOMP>2</FUNDCOMP>
        <StudentOnModule>
            <MODID>09|12345</MODID>
            <MODOUT>4</MODOUT>
            <MODSTAT>2</MODSTAT>
        </StudentOnModule>
        <StudentOnModule>
            <MODID>09|24863</MODID>
            <MODOUT>2</MODOUT>
            <MODSTAT>2</MODSTAT>
        </StudentOnModule>
    </Instance>
    <Instance>
    <NUMHUS>2</NUMHUS>
    <OWNINST>1439582|2</OWNINST>
    <FUNDCOMP>2</FUNDCOMP>
        <StudentOnModule>
            <MODID>08|24685</MODID>
            <MODOUT>1</MODOUT>
            <MODSTAT>2</MODSTAT>
        </StudentOnModule>

    </Instance>
</Student>

我使用OWNINST更改FUNDCOMP的样式表如下:

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/>
    <xsl:strip-space elements="*"/>

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

    <xsl:template match="Student/Instance[OWNINST = document('ss6_FUNDCOMP.xml')/studentstoamend/STUDENT/OWNINST]/FUNDCOMP">
        <xsl:copy-of select="document('ss6_FUNDCOMP.xml')/studentstoamend/STUDENT[OWNINST = current()/../OWNINST]/FUNDCOMP"/>
    </xsl:template>

</xsl:stylesheet>

包含新FUNDCOMP值的XML文件示例如下:

<?xml version="1.0" encoding="UTF-8"?>
<studentstoamend>
<STUDENT><OWNINST>1308538|1</OWNINST><FUNDCOMP>2</FUNDCOMP></STUDENT>
<STUDENT><OWNINST>1490044|1</OWNINST><FUNDCOMP>1</FUNDCOMP></STUDENT>
<STUDENT><OWNINST>1522978|2</OWNINST><FUNDCOMP>1</FUNDCOMP></STUDENT>
<STUDENT><OWNINST>903797|2</OWNINST><FUNDCOMP>1</FUNDCOMP></STUDENT>
<STUDENT><OWNINST>1231086|1</OWNINST><FUNDCOMP>1</FUNDCOMP></STUDENT>
</studentstoamend>

非常感谢并且对不正确使用任何术语表示道歉。

亚历

0 个答案:

没有答案