将字符串解析为 XML 并将 xPath 解析为它 - XSLT 2 或 3
Parse string to XML and xPath into it - XSLT 2 or 3
答案可以是 XSLT 2.0 或 3.0; Saxon EE 解析器
给定 XML 个样本:
<theRootNode xmlns="http://myNamespace">
<xml>
<Company>
<TaxIdentity>
<id/>
</TaxIdentity>
<TaxIdentity>
<id>42-123456</id>
</TaxIdentity>
<Name>ABC Company</Name>
<Number>2230</Number>
</Company>
</xml>
</theRootNode>
我有一个 2.0 XSLT 样式表,它删除了名称空间并解析了 xml 节点。在同一个转换中,我现在需要删除在我刚刚解析的 xml 节点中具有空值的所有 'TaxIdentity' 节点。
目前的结果是:
<theRootNode>
<xml>
<Company>
<TaxIdentity>
<id/>
</TaxIdentity>
<TaxIdentity>
<id>42-123456</id>
</TaxIdentity>
<Name>ABC Company</Name>
<Number>2230</Number>
</Company>
</xml>
</theRootNode>
期望的结果是:
<theRootNode>
<xml>
<Company>
<TaxIdentity>
<id>42-123456</id>
</TaxIdentity>
<Name>ABC Company</Name>
<Number>2230</Number>
</Company>
</xml>
</theRootNode>
我的 XSLT 在下面。请注意,我的想法是使用 as="element() 或使用 parse-xml(版本 3)将初始结果放入变量中,但我似乎无法删除空节点。请注意,我的目标不是删除所有空元素或节点...只是那些名为 TaxIdentiy 的元素。我应该采用什么方法?解决方案?我真的需要在同一个转换中全部使用。谢谢。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no" omit-xml-declaration="yes"/>
<!-- Copy elements without copying their namespace declarations -->
<xsl:template match="*[not(local-name() = 'xml')]" name="identity">
<xsl:element name="{name()}" namespace="">
<xsl:apply-templates select="node() | @*"/>
</xsl:element>
</xsl:template>
<!-- Copy content as is with lower priority -->
<xsl:template match="node() | @*" priority="-2">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<!-- turn xml node content back into xml -->
<xsl:template match="*[local-name() = 'xml']">
<xsl:element name="xml" inherit-namespaces="no" namespace="">
<xsl:value-of select="." disable-output-escaping='yes'/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
这是我的 XSLT 3.0 建议,它简单地用 parse-xml
解析 XML,然后使用模板将模板应用到解析的节点,删除带有所有空子元素的 TaxIdentity
:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:math="http://www.w3.org/2005/xpath-functions/math"
xmlns:is="http://myNamespace"
exclude-result-prefixes="is xs math"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="is:*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@* , node()"></xsl:apply-templates>
</xsl:element>
</xsl:template>
<xsl:template match="is:xml">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="parse-xml(.)/node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="TaxIdentity[not(*[normalize-space()])]"/>
</xsl:stylesheet>
答案可以是 XSLT 2.0 或 3.0; Saxon EE 解析器
给定 XML 个样本:
<theRootNode xmlns="http://myNamespace">
<xml>
<Company>
<TaxIdentity>
<id/>
</TaxIdentity>
<TaxIdentity>
<id>42-123456</id>
</TaxIdentity>
<Name>ABC Company</Name>
<Number>2230</Number>
</Company>
</xml>
</theRootNode>
我有一个 2.0 XSLT 样式表,它删除了名称空间并解析了 xml 节点。在同一个转换中,我现在需要删除在我刚刚解析的 xml 节点中具有空值的所有 'TaxIdentity' 节点。
目前的结果是:
<theRootNode>
<xml>
<Company>
<TaxIdentity>
<id/>
</TaxIdentity>
<TaxIdentity>
<id>42-123456</id>
</TaxIdentity>
<Name>ABC Company</Name>
<Number>2230</Number>
</Company>
</xml>
</theRootNode>
期望的结果是:
<theRootNode>
<xml>
<Company>
<TaxIdentity>
<id>42-123456</id>
</TaxIdentity>
<Name>ABC Company</Name>
<Number>2230</Number>
</Company>
</xml>
</theRootNode>
我的 XSLT 在下面。请注意,我的想法是使用 as="element() 或使用 parse-xml(版本 3)将初始结果放入变量中,但我似乎无法删除空节点。请注意,我的目标不是删除所有空元素或节点...只是那些名为 TaxIdentiy 的元素。我应该采用什么方法?解决方案?我真的需要在同一个转换中全部使用。谢谢。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no" omit-xml-declaration="yes"/>
<!-- Copy elements without copying their namespace declarations -->
<xsl:template match="*[not(local-name() = 'xml')]" name="identity">
<xsl:element name="{name()}" namespace="">
<xsl:apply-templates select="node() | @*"/>
</xsl:element>
</xsl:template>
<!-- Copy content as is with lower priority -->
<xsl:template match="node() | @*" priority="-2">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<!-- turn xml node content back into xml -->
<xsl:template match="*[local-name() = 'xml']">
<xsl:element name="xml" inherit-namespaces="no" namespace="">
<xsl:value-of select="." disable-output-escaping='yes'/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
这是我的 XSLT 3.0 建议,它简单地用 parse-xml
解析 XML,然后使用模板将模板应用到解析的节点,删除带有所有空子元素的 TaxIdentity
:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:math="http://www.w3.org/2005/xpath-functions/math"
xmlns:is="http://myNamespace"
exclude-result-prefixes="is xs math"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="is:*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@* , node()"></xsl:apply-templates>
</xsl:element>
</xsl:template>
<xsl:template match="is:xml">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="parse-xml(.)/node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="TaxIdentity[not(*[normalize-space()])]"/>
</xsl:stylesheet>