【问题标题】:使用 XSLT 转换 XML,但只转换某些节点、属性、
【发布时间】:2019-09-26 01:10:07
【问题描述】:

我在这里有一个源 XML 文件,并希望使用 XSLT 对其进行转换。由于原始 XML 文件相当复杂。

我尝试使用 Eclipse 对其进行转换。这是我的 XSL 代码。 转换的目标是另一个程序现在可以读取结构化 XML。

 <?xml version="1.0"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        version="1.0">

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

        <!-- Copy everything -->
        <xsl:template match="*">
            <xsl:copy>
                <xsl:copy-of select="@*" />
                <xsl:apply-templates />
            </xsl:copy>
        </xsl:template>

        <!-- Do some adjustments for the address -->
        <xsl:template match="packagedElement">
            <xsl:element name="Adresse">
                <xsl:apply-templates />
            </xsl:element>
        </xsl:template>

        <!-- here I try to select the ownedAttribute node and select only the Name(s) however it doesn´t work out  -->
    <xsl:template match="//ownedAttribute[@name='quelle1']">
        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>


        </xsl:template>
    </xsl:stylesheet>

这是我的源 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<xmi:XMI xmi:version="20131001" 

<uml:Model xmi:id="_UMyDIP-vEeiYTffJXPS1ig" name="Fallbeispiel1">

</packageImport>
    <packagedElement xmi:type="uml:Class" xmi:id="_f7jXYP-vEeiYTffJXPS1ig" name="Produktion" classifierBehavior="_qcIkwP-wEeiYTffJXPS1ig">
      <ownedAttribute xmi:type="uml:Property" xmi:id="_K8DCIP-wEeiYTffJXPS1ig" name="quelle1" type="_h4oIEP-vEeiYTffJXPS1ig"/>

</xmi:XMI>

。 . . .

我的结果应该是这样的:

<?xml version="1.0" encoding="ISO-8859-1"?>

-<xmi:XMI xmlns:xmi="http://www.omg.org/XMI" xmi:version="2.0">


-<Block name="Produktion">

<property name="quelle1"/>

<property name="maschine1" />

<property name="foerdereinrichtung1" />

我对ownedAttribute 的目标是只允许输出名称。

【问题讨论】:

  • 如果您发布更好(完整)的输入样本和预期输出,您将获得更多答案。

标签: xml xslt


【解决方案1】:

您提供的输入格式不正确。它还缺少一些命名空间声明。

虽然我假设输入源如下:

<?xml version="1.0" encoding="UTF-8"?>
<xmi:XMI xmi:version="20131001" 
         xmlns:xmi="http://www.omg.org/XMI"
         xmlns:uml="href://org.omg/UML/1.3">

<uml:Model xmi:id="_UMyDIP-vEeiYTffJXPS1ig" name="Fallbeispiel1">
    <packagedElement xmi:type="uml:Class" xmi:id="_f7jXYP-vEeiYTffJXPS1ig" name="Produktion" classifierBehavior="_qcIkwP-wEeiYTffJXPS1ig">
        <ownedAttribute xmi:type="uml:Property" xmi:id="_K8DCIP-wEeiYTffJXPS1ig" name="quelle1" type="_h4oIEP-vEeiYTffJXPS1ig" />
        <ownedAttribute xmi:type="uml:Property" xmi:id="_K8DCIP-wEeiYTffJXPS1ig" name="maschine1" type="_h4oIEP-vEeiYTffJXPS1ig" />
    </packagedElement>
</uml:Model>

并修改了你的 xslt 以达到预期的效果:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
            xmlns:uml="href://org.omg/UML/1.3"
            xmlns:xmi="http://www.omg.org/XMI" version="1.0">

<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />

<!-- Copy everything -->
<xsl:template match="*">
    <xsl:copy>
        <xsl:copy-of select="@*" />
        <xsl:apply-templates />
    </xsl:copy>
</xsl:template>

<!-- Do some adjustments for the address -->
<xsl:template match="packagedElement">
    <xsl:element name="Block">
        <xsl:attribute name="name">
                <xsl:value-of select="@name" />
            </xsl:attribute>
        <xsl:apply-templates />
    </xsl:element>
</xsl:template>

<!-- here I try to select the ownedAttribute node and select only the Name(s) however it doesn´t work out -->
<xsl:template match="ownedAttribute">
    <xsl:element name="property">
        <xsl:attribute name="name">
            <xsl:value-of select="@name" />
        </xsl:attribute>
        <xsl:apply-templates />
    </xsl:element>
</xsl:template>

<xsl:template match="uml:Model">
    <xsl:apply-templates />
</xsl:template>
</xsl:stylesheet>

在此处查看演示:https://xsltfiddle.liberty-development.net/94rmq6y

如果我遗漏了什么或者这不能解决您的问题,请告诉我。

【讨论】:

  • 请注意match="ownedAttribute" 模板的主体可以简化为&lt;property name="{@name}"&gt;&lt;xsl:apply-templates/&gt;&lt;/property&gt;
猜你喜欢
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
相关资源
最近更新 更多