a img
является встроенным замененным элементом , в отличие от span
, например, когда это встроенный незаменяемый элемент , и мы можем определить ширину / высоту заменяемого элемента. Вот соответствующая часть спецификации, которая определяет, как должна вести себя высота / ширина
https://www.w3.org/TR/CSS2/visudet.html#inline-replaced-width [116 ]
https://www.w3.org/TR/CSS2/visudet.html#inline-replaced-height
Когда дело доходит до не -Заменены элементы, вы найдете это:
Свойство 'width' не применяется. ref sup>
Свойство height не применяется. ref sup>
blockquote>Та же логика применима к преобразованию, где мы можем применить преобразование к
img
, а не кspan
.Связанные: https://stackoverflow.com/a/54227332/8620333
https://developer.mozilla.org/en -US / docs / Web / CSS / Replaced_element
https://html.spec.whatwg.org/multipage/rendering.html#replaced-elements
Обратите внимание, что в спецификации также сказано, что замененный элемент встроенного блока точно такой же, как и замененный встроенный элемент, поэтому создание img
inline
илиinline-block
не будет иметь значения. [ 1124]
Следующее преобразование XSLT 1.0 приводит к правильному результату:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:key name="contract" match="ContractInfo" use="@ContractNo" />
<xsl:key name="filedata" match="Filedata" use="../../@ContractNo" />
<xsl:template match="ContractInfo">
<xsl:if test="generate-id() =
generate-id(key('contract', @ContractNo)[1])">
<xsl:copy>
<xsl:apply-templates select="key('contract', @ContractNo)/Details | @*" />
</xsl:copy>
</xsl:if>
</xsl:template>
<xsl:template match="Details">
<xsl:if test="generate-id(..) =
generate-id(key('contract', ../@ContractNo)[1])">
<xsl:copy>
<xsl:apply-templates select="key('filedata', ../@ContractNo) | @*" />
</xsl:copy>
</xsl:if>
</xsl:template>
<!-- copy everything else (root node, Filedata nodes and @attributes) -->
<xsl:template match="* | @*">
<xsl:copy>
<xsl:apply-templates select="* | @*" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Отметьте использование <xsl:key>
в сочетании с generate-id()
определить первый узел набора узлов соответствия, эффективно собирая в группу равные узлы.
Можно вызвать заказанный результат при помощи <xsl:sort>
в <xsl:apply-templates>
. Я не включал это ради ясности.
Мой тестовый вывод:
<root>
<ContractInfo ContractNo="12345">
<Details LastName="Goodchild">
<Filedata FileName="File1"></Filedata>
<Filedata FileName="File2"></Filedata>
</Details>
</ContractInfo>
<ContractInfo ContractNo="123456">
<Details LastName="Goodchild">
<Filedata FileName="File2"></Filedata>
</Details>
</ContractInfo>
</root>