我有一个很大的输入 XML,我想为特定的客户端缩小它。客户应该只看到与他相关的信息。这是示例输入。
<?xml version='1.0' encoding='UTF-8' ?>
<reg>
<global>stuff</global>
<profile>
<profile_data>profile stuff 1</profile_data>
<users>
<u><usr_data>usr options 1</usr_data><n>user-1</n></u>
<u><usr_data>usr options 2</usr_data><n>user-2</n></u>
</users>
</profile>
<profile>
<profile_data>profile stuff 2</profile_data>
<users>
<u><usr_data>usr options 3</usr_data><n>user-3</n></u>
<u><usr_data>usr options 4</usr_data><n>user-4</n></u>
</users>
</profile>
</reg>
这需要转换成一个更小的 XML,如下所示:
<?xml version="1.0"?>
<reg>
<global>stuff</global>
<profile>
<profile_data>profile stuff 1</profile_data>
<users>
<u><usr_data>usr options 1</usr_data><n>user-1</n></u>
</users>
</profile>
</reg>
我已经成功地使用 2 个串联应用的 XSLT 转换(trans1.xml)来实现这一点:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="name"/>
<xsl:output method="xml"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/reg/profile">
<xsl:if test="./users/*/n=$name">
<xsl:copy-of select="." />
</xsl:if>
</xsl:template>
</xsl:stylesheet>
和(trans2.xml):
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="name"/>
<xsl:output method="xml"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/reg/profile/users/*">
<xsl:if test="./n=$name">
<xsl:copy-of select="." />
</xsl:if>
</xsl:template>
</xsl:stylesheet>
然后:
xsltproc -param name "'user-1'" trans1.xml input.xml > out1.xml
xsltproc -param name "'user-1'" trans2.xml out1.xml > result.xml
如何将我的 2 个 XSl 样式表转换为 1 个,以便在 1 个步骤中执行这 2 个操作。