使用XSLT从其他XML文件中提取部分XML

时间:2015-03-09 11:13:41

标签: xml xslt xslt-1.0

我正在从源XML文件中提取XML文件的一部分。我是XSLT部分的新手,但是我试图编写XSLT,但是在获取正确的数据方面没有任何好运。

例如,我有像

这样的XML
> <?xml version="1.0" encoding="utf-8"?>
<Response xmlns="https://insuredapp.com/rating/" id="24d846677aefd1bd7fdf52286e692a22">
    <Result type="request">
        <abc>
            <bcd>

            </bcd>
        </abc>
    </Result>
    <Result type="response">
        <InsuranceSvcRs>
            <PersPkgPolicyQuoteInqRs>
                <PersPolicy>
                    <Coverage>
                        <!--- Some MOre Elemetns -->
                    </Coverage>
                    <Coverage>
                        <!--- Some MOre Elemetns -->
                    </Coverage>
                    <Coverage>
                        <!--- Some MOre Elemetns -->
                    </Coverage>
                </PersPolicy>
            </PersPkgPolicyQuoteInqRs>
        </InsuranceSvcRs>
    </Result>
</Response>

应用XSLT转换后,我希望输出为

> <?xml version="1.0" encoding="utf-8"?>
<Coverages>
    <Coverage>
        <!--- Some More Elements -->
    </Coverage>
    <Coverage>
        <!--- Some More Elements -->
    </Coverage>
    <Coverage>
        <!--- Some More Elements -->
    </Coverage>
</Coverages>

为了使用XSLT提取上述覆盖范围,我编写了以下XSLT代码

> <?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/Response/Result[@type='response']/InsuranceSvcRs/PersPkgPolicyQuoteInqRs/PersPolicy">
        <!--<xsl:for-each select="/Response/Result[@type='response']/InsuranceSvcRs/PersPkgPolicyQuoteInqRs/PersPolicy/Coverage">
            <xsl:value-of select="CoverageCd"/>
        </xsl:for-each>-->

        <xsl:copy>
            <xsl:apply-templates select="/Response/Result[@type='response']/InsuranceSvcRs/PersPkgPolicyQuoteInqRs/PersPolicy"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

但我没有得到理想的输出,请仔细研究。

1 个答案:

答案 0 :(得分:1)

首先,输入文档中有一个默认命名空间

<Response xmlns="https://insuredapp.com/rating/">

如果您想从此输入中选择单个元素,则必须在XSLT样式表中重新声明此命名空间:

<xsl:stylesheet xmlns:resp="https://insuredapp.com/rating/">

从匹配/(文档节点)的模板开始,输出Coverages并使用xsl:copy-of指令。

XSLT样式表

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:resp="https://insuredapp.com/rating/"
    exclude-result-prefixes="resp">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/">
       <Coverages xmlns="https://insuredapp.com/rating/">
          <xsl:copy-of select="//resp:Coverage"/>
       </Coverages>
    </xsl:template>

</xsl:stylesheet>

XML输出

<?xml version="1.0" encoding="UTF-8"?>
<Coverages xmlns="https://insuredapp.com/rating/">
   <Coverage>
      <!--- Some MOre Elemetns -->
   </Coverage>
   <Coverage>
      <!--- Some MOre Elemetns -->
   </Coverage>
   <Coverage>
      <!--- Some MOre Elemetns -->
   </Coverage>
</Coverages>

请注意,输出中的元素仍在命名空间中。目前尚不清楚你是否想要摆脱那个命名空间。